2012-03-16 10 views
5

कोड का यह टुकड़ा क्यों संकलित करता है?सशर्त शाखाएं

#include <iostream> 

int foo(int x) 
{ 
    if(x == 10) 
    return x*10; 
} 

int main() 
{ 
int a; 
std::cin>>a; 
std::cout<<foo(a)<<'\n'; 
} 

संकलक मेरे जैसे "नहीं सभी कोड पथ एक मान देता है" एक त्रुटि नहीं देना चाहिए? क्या होता है/मेरा कार्य वापस करता है जब x दस के बराबर नहीं होता है?

+0

कड़ाई से संबंधित नहीं है, लेकिन आपकी रुचि बढ़ा सकता है: http://stackoverflow.com/questions/9653722/how-does-returning-values-from-a-function-work – Corbin

+0

बीटीडब्लू: यह किस कंपाइलर है (ताकि मैं भविष्य में इससे बच सकता हूं)? –

+1

@ निकोलबोलस: कंपाइलर से बचें, चेतावनी-झंडे के बिना संकलन से बचें! – bitmask

उत्तर

10

परिणाम अपरिभाषित है, इसलिए संकलक चुनने के लिए स्वतंत्र है - संभवतः आपको उचित स्टैक पते पर बैठने के लिए क्या होता है जहां कॉलर परिणाम की अपेक्षा करता है। कंपाइलर चेतावनियां सक्रिय करें, और आपका कंपाइलर आपको आपके चूक के बारे में सूचित करेगा।

+0

किसी फ़ंक्शन को कॉल करना जो कुछ वापस करना चाहिए लेकिन नहीं, कुछ सिस्टम पर एक सुंदर क्रैश का कारण बन सकता है। – karlphillip

+1

@karlphillip: हां, क्योंकि संकलक कानूनी रूप से आपके घर को जलाने या ड्रैगन को अपनी नाक उड़ाने की अनुमति देता है। यही कारण है कि मैंने शब्द * शायद * :) – bitmask

+0

जोड़ा मैंने देखा :) मैंने यह इंगित करने के लिए एक टिप्पणी भी दी कि यह अभ्यास कितना बुरा हो सकता है। वैसे जवाब, अच्छा जवाब। – karlphillip

3

संकलक आवश्यक नहीं है ताकि आपको इस परिस्थिति में कोई त्रुटि मिल सके। कई लोग करेंगे, कुछ केवल चेतावनियां जारी करेंगे। कुछ स्पष्ट रूप से नोटिस नहीं करेंगे।

ऐसा इसलिए है क्योंकि यह संभव है कि आपका कोड इस फ़ंक्शन के बाहर सुनिश्चित करता है कि स्थिति हमेशा सत्य होगी। इसलिए, यह आवश्यक नहीं है खराब (हालांकि यह लगभग हमेशा होता है, यही कारण है कि अधिकांश कंपाइलर कम से कम एक चेतावनी जारी करेंगे)।

विनिर्देश बताएगा कि एक फ़ंक्शन से बाहर निकलने का नतीजा जो मूल्य लौटाएगा लेकिन अपरिभाषित व्यवहार नहीं है। एक मूल्य वापस किया जा सकता है। या कार्यक्रम दुर्घटनाग्रस्त हो सकता है। या कुछ भी हो सकता है। यह अपरिभाषित है।

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