ठीक है, मैं एक छोटे से इस सवाल पूछने के लिए शर्मिंदा हूँ, लेकिन मैं सिर्फ यह सुनिश्चित होना चाहते हैं ...शॉर्ट सर्किट मूल्यांकन और साइड इफेक्ट
यह ज्ञात है कि सी बूलियन भाव में शॉर्ट सर्किट मूल्यांकन का उपयोग करता है:
int c = 0;
if (c && func(c)) { /* whatever... */ }
कि उदाहरण func(c)
में नहीं बुलाया क्योंकि c
0
का आकलन करती है। लेकिन अधिक परिष्कृत उदाहरण के बारे में, जहां तुलना के साइड इफेक्ट्स की तुलना में परिवर्तनीय की तुलना में बदल जाएगी?
int c; /* this is not even initialized... */
if (canInitWithSomeValue(&c) && c == SOMETHING) { /*...*/ }
समारोह canInitWithSomeValue
रिटर्न सच और सफलता के मामले में दिए गए सूचक पर परिवर्तन मूल्य: इस तरह। क्या यह गारंटी है कि इस उदाहरण में बाद की तुलना (c == SOMETHING
) canInitWithSomeValue(&c)
द्वारा मान सेट का उपयोग करती है?
कोई फर्क नहीं पड़ता कि संकलक कितने भारी अनुकूलन का उपयोग करता है?
मुझे लगता है कि आप शॉर्ट सर्किट मूल्यांकन और संकलक अनुकूलन को भ्रमित कर सकते हैं। पहले उदाहरण में, संकलक उस पूरे 'if' कथन को ऑप्टिमाइज़ कर देगा, क्योंकि यह कभी नहीं चला सकता है। शॉर्ट सर्किट-मूल्यांकन का अर्थ यह होगा कि यदि आपके पास 'if (func1() && func2()) {...}', और func1() को रनटाइम ** पर झूठी ** का मूल्यांकन किया गया था (यानी संकलन करते समय निश्चित रूप से नहीं), तो कोड को 'func2() 'की जांच नहीं करनी चाहिए - कंपाइलर को मशीन कोड तैयार करना चाहिए था कि अगर' func1() 'गलत है, तो' func2() 'नहीं कहा जाता है। – Stephen
कि 'int c = 0' यह इंगित करने के लिए था कि' सी' तुलना के समय '0' के बराबर है, मुझे एहसास है कि एक ऐसे मामले में जो संकलक सरल 'if' को अनुकूलित करेगा। –
आह, मैं क्षमा चाहता हूं। मैंने आपको गलत समझा मैं क्षमाप्रार्थी हूं। – Stephen