मैं एक परिचय सी ++ कक्षा के लिए एक टीए हूं। निम्नलिखित प्रश्न पिछले सप्ताह एक परीक्षण पर कहा गया था:सी ++ एम्बेडेड फ़ंक्शन कॉल के साथ आउटपुट मूल्यांकन ऑर्डर
int myFunc(int &x) {
int temp = x * x * x;
x += 1;
return temp;
}
int main() {
int x = 2;
cout << myFunc(x) << endl << myFunc(x) << endl << myFunc(x) << endl;
}
जवाब है, मुझे और मेरे सभी साथियों को, जाहिर है:
8
27
64
क्या निम्नलिखित कार्यक्रम से उत्पादन होता है
लेकिन अब कई छात्रों ने इंगित किया है कि जब वे कुछ वातावरण में इसे चलाते हैं तो वे वास्तव में विपरीत होते हैं:
64
27
8
जब मैं इसे अपने लिनक्स पर्यावरण में जीसीसी का उपयोग करके चलाता हूं तो मुझे वह उम्मीद मिलती है जो मैं अपेक्षा करता हूं। मेरी विंडोज मशीन पर मिनीजीडब्लू का उपयोग करके मुझे लगता है कि वे किस बारे में बात कर रहे हैं। ऐसा लगता है कि मेरे पहले फनक को अंतिम कॉल का मूल्यांकन किया जा रहा है, फिर दूसरा कॉल और फिर पहला, फिर एक बार इसके परिणाम होने के बाद यह सामान्य क्रम में आउटपुट होता है, जो पहले से शुरू होता है। लेकिन क्योंकि कॉल आदेश से बाहर किए गए थे क्योंकि संख्याएं विपरीत हैं।
ऐसा लगता है कि मुझे एक संकलक अनुकूलन माना जाता है, जो विपरीत क्रम में फ़ंक्शन कॉल का मूल्यांकन करने का चयन करता है, लेकिन मुझे वास्तव में क्यों पता नहीं है। मेरा सवाल है: क्या मेरी धारणाएं सही हैं? क्या पृष्ठभूमि में क्या चल रहा है? या क्या कुछ बिल्कुल अलग है? साथ ही, मैं वास्तव में समझ में नहीं आता कि पीछे के कार्यों का मूल्यांकन करने और फिर आउटपुट का मूल्यांकन करने का लाभ क्यों होगा। ओस्ट्रीम काम के तरीके के कारण आउटपुट आगे बढ़ना होगा, लेकिन ऐसा लगता है कि कार्यों का मूल्यांकन आगे भी होना चाहिए।
आपकी मदद के लिए धन्यवाद!
स्पष्टीकरण के लिए धन्यवाद, मुझे लगा कि यह एक अनिर्धारित कल्पना का एक उदाहरण था, लेकिन अब मैं इसके बारे में सुनिश्चित हो सकता हूं। और यह छात्रों के लिए एक उदाहरण के रूप में खड़ा हो सकता है कि साइड इफेक्ट्स और अत्यधिक जटिल घोंसले क्यों खराब हैं :) –
+1। और विशेष रूप से, ध्यान दें कि कार्यक्रम अपरिभाषित व्यवहार प्रदर्शित नहीं करता है। 'x' अभी भी दो अनुक्रम बिंदुओं के बीच सबसे अधिक बार बदल गया है, क्योंकि फ़ंक्शन कॉल निष्पादन एक-दूसरे को अंतःस्थापित नहीं कर सकते हैं। इसका व्यवहार अनिर्दिष्ट है और cout अभिव्यक्ति कथन के बाद, 'x' का मान होना चाहिए 5. –
@onebyone:" नफरत "भाग बहुत मजेदार है :) :) –