/ / गैर-शून्य कार्यों के लिए असाइनमेंट (कुछ नहीं लौटाने) मूल्यों को बदल सकता है? - सी ++

गैर-शून्य कार्यों के लिए असाइनमेंट (कुछ नहीं लौटाने) मूल्यों को बदल सकता है? - सी ++

मुझे अपने कार्यक्रम में इस समस्या का सामना करना पड़ा जो समस्याएं पैदा कर रहा था। तो मुझे इसे एक उदाहरण द्वारा समझाएं:

#include<iostream>

int func(){
if(1==0) return 100;
}

int main(){

int x=99;
x= func();
std::cout<<"Value of x: " << x <<std::endl;
}

मुझे लगा था कि आउटपुट होगा 99 लेकिन आउटपुट है 0, तो यहाँ क्या हो रहा है?

उत्तर:

जवाब के लिए 3 № 1

आपके पास अपरिभाषित व्यवहार क्योंकि आपका फ़ंक्शन वापस लौटने के लिए घोषित किया गया है int लेकिन फ़ंक्शन के माध्यम से निष्पादन पथ कभी नहीं पहुंचता है return बयान।

C ++ में गैर-रिटर्न के रूप में परिभाषित एक फ़ंक्शन से बाहर निकलना अवैध हैvoid किसी तर्क के साथ वापसी विवरण के माध्यम से टाइप करें।

आईएसओ / आईईसी 14882: 2003 6.6.3 [stmt.return] / 2:

[...] किसी फ़ंक्शन के अंत में फ़्लू करना बिना किसी मूल्य के वापसी के बराबर है; इससे मान-लौटाने वाले फ़ंक्शन में अपरिभाषित व्यवहार होता है।


जवाब के लिए 4 № 2

यह अपरिभाषित व्यवहार का कारण बन रहा है। स्थिति झूठी है इसलिए फ़ंक्शन से कोई वापसी मान नहीं है।


जवाब के लिए 2 № 3

C ++ 03 6.6.3 / 2 "द रिटर्न स्टेटमेंट" से:

किसी फ़ंक्शन के अंत से फ़्लॉइंग करना बिना किसी मूल्य के वापसी के बराबर है; इससे मान-लौटाने वाले फ़ंक्शन में अपरिभाषित व्यवहार होता है।

चूंकि आपका फ़ंक्शन "ऑफ द एंड" बहता है, इसलिए यह यूबी है और आप कुछ भी (या कुछ भी) की उम्मीद कर सकते हैं।

एक साइड नोट के रूप में: यह C की तुलना में थोड़ा अलग है, जहां एक फ़ंक्शन के अंत से बहती है जिसे कुछ वापस करने की घोषणा की जाती है नहीं यूबी अपने आप में - यह यूबी केवल कॉल करने वाले व्यक्ति बन जाता है का उपयोग करता है एक फ़ंक्शन का परिणाम जो ऐसा करता है।

दूसरे शब्दों में, आपके उदाहरण का उपयोग करते हुए, C ++ में आपके पास इस समय UB है func() रिटर्न, चाहे वह परिणाम को सौंपा गया हो x या नहीं। सी में यह केवल यूबी है क्योंकि आप परिणाम को असाइन करते हैं x.


उत्तर के लिए 1 № 4

यह आपके द्वारा उपयोग किए जा रहे कंपाइलर पर निर्भर करता है।

जब आप इस कोड को संकलित करते हैं, तो एक सामान्य संकलक एक चेतावनी के समान होगा:

C4715 चेतावनी: "func": सभी नियंत्रण पथ एक मान नहीं लौटाते हैं

ऐसा लगता है कि आपका कंपाइलर एक स्टेटमेंट दे रहा है जो रिटर्न करता है 0 जब यह नहीं मिल "एक return बाहर जाने पर बयान। इसलिए, x सौंपा जाएगा 0.


जवाब के लिए 0 № 5

जैसा कि बाकी सभी ने कहा है, आपने अपरिभाषित किया हैव्यवहार। इसे ठीक करने / पहचानने के तरीके के रूप में, अपने कार्यक्रम को संकलित करते समय चेतावनी झंडे का उपयोग करने का एक तरीका होगा। यदि आप अपना कोड कोडपैड में चलाते हैं, तो समस्या को देखना आसान है:

http://codepad.org/MXDSniWw

cc1plus: warnings being treated as errors
In function "int func()":
Line 5: warning: control reaches end of non-void function

में func(), अगर लूप कभी सच नहीं होता है, लेकिन आपने कोई अन्य रिटर्न मान निर्दिष्ट नहीं किया है, तो आपके पास अपरिभाषित है return 0; के बाद if.. समस्या को ठीक कर देगा।


जवाब के लिए 0 № 6

तो आप एक 99 की उम्मीद करते हैं, सबसे सुरक्षित शर्त संदर्भ द्वारा x पास करना है:

#include<iostream>

void func(int& a){
if (1==0)
a = 100;
}

int main(){
int x(99);
func(x);
std::cout << "Value of x: " << x << std::endl;
}