2010-04-08 22 views
12

जैसी उम्मीद थी, संकलक (VisualStudio 2008) एक चेतावनीसमारोह

चेतावनी C4715 दे देंगे नहीं सभी नियंत्रण पथ मान

जब निम्नलिखित कोड संकलन:

int doSomethingWith(int value) 
{ 
    int returnValue = 3; 
    bool condition = false; 

    if(condition) 
     // returnValue += value; // DOH 

    return returnValue; 
} 

int main(int argc, char* argv[]) 
{ 
    int foo = 10; 
    int result = doSomethingWith(foo); 
    return 0; 
} 

लेकिन कार्यक्रम ठीक चलाता है। फ़ंक्शन doSomethingWith() का वापसी मान 0.

केवल अपरिभाषित व्यवहार है, या कोई निश्चित नियम है कि रनटाइम पर परिणाम मान कैसे बनाया/गणना की जाती है। गैर-पीओडी डेटाटाइप के साथ वापसी मूल्य के रूप में क्या होता है?

+1

इस उत्तर को देखें: http://stackoverflow.com/questions/1610030/why-can-you-return-from-a-non-void-function-without-returning-a-value- बिना समर्थक/1610454 # 1610454 –

+0

@fnieto: आह, मैं देखता हूं, यह एक बहुत अच्छा जवाब है। हालांकि यह खुद को नहीं मिला, पूछने से पहले ... – nabulke

उत्तर

17

यह अपरिभाषित व्यवहार आईएसओ सी ++ मानक खंड 6.6.3 में निर्दिष्ट है:

एक समारोह के अंत की ओर बहने वाली कोई मूल्य नहीं के साथ एक लाभ के समतुल्य है, इस परिणाम को में एक मान-वापसी कार्य में अपरिभाषित व्यवहार में परिणाम मिलता है।

+2

विशिष्ट शब्द: - किसी फ़ंक्शन के अंत में बहने से कोई मूल्य नहीं होने पर 'वापसी 'के बराबर होता है; इसके परिणामस्वरूप मान-वापसी कार्य में अपरिभाषित व्यवहार में परिणाम होता है। – kennytm

+1

'मुख्य' फ़ंक्शन उस नियम का अपवाद है। नबुलके कोड में, अंतिम 'मुख्य' फ़ंक्शन लाइन अनावश्यक है। –

+0

इस उत्तर के लिए _important_ अतिरिक्त के रूप में, 3.6.1/5 कहता है: "यदि नियंत्रण 'वापसी' कथन के बिना 'मुख्य' के अंत तक पहुंच जाता है, तो प्रभाव 'वापसी 0;' निष्पादित करने का होता है। –

2

मूल्य-वापसी समारोह से मूल्य वापस नहीं लौटाए जाने से अपरिभाषित व्यवहार होता है।

7

x86 प्रोसेसर के लिए, मानक कॉलिंग सम्मेलन ईएक्स रजिस्टर में वापसी मूल्य डालता है। व्यावहारिक रूप से इसका मतलब है कि अधिकांश कंपाइलरों के लिए यदि हम बिना किसी वापसी के फ़ंक्शन के अंत तक पहुंच जाते हैं, तो अंतिम गणित ऑपरेशन का परिणाम वापस कर दिया जाएगा। हालांकि, आप इस पर भरोसा नहीं कर सकते हैं और यह पोर्टेबल नहीं है।

http://en.wikipedia.org/wiki/X86_calling_conventions#cdecl

+0

जानना दिलचस्प है! हम वास्तव में एक समारोह में एक रिटर्न लापता था जो उस वजह से परीक्षण पास कर रहा था। –

3

@piotr जवाब अपडेट कर रहा है।

C++17 Standard धारा 9.6.3

एक निर्माता, एक नाशक, या एक सीवी शून्य वापसी प्रकार के साथ एक समारोह के अंत की ओर बहने वाली से कोई संकार्य के साथ एक वापसी के बराबर है। अन्यथा, मुख्य (6.6.1) के अलावा किसी अन्य फ़ंक्शन के अंत में अपरिभाषित व्यवहार में परिणाम बहते हैं।

संबंधित मुद्दे