मुझे लगता है कि मूल्यांकन के आदेश के बारे में मसौदा मानक का यह हिस्सा प्रासंगिक है:
1.9 कार्यक्रम निष्पादन
...
- जहां नोट किया गया है, सिवाय इसके कि अलग-अलग संचालकों के संचालनों का मूल्यांकन और व्यक्तिगत अभिव्यक्तियों के उप-वर्गों के मूल्यांकन का परिणाम नहीं है। ऑपरेटर के परिणाम के मान की गणना संचालक के परिणाम की गणना के पहले की जाती है। यदि एक स्केलर ऑब्जेक्ट पर एक साइड इफेक्ट एक समान स्केलर ऑब्जेक्ट पर या तो एक साइड इफेक्ट या एक ही स्केलर ऑब्जेक्ट के मूल्य का उपयोग करके मूल्य गणना के सापेक्ष अप्रयुक्त है, और वे संभावित समवर्ती नहीं हैं, तो व्यवहार अपरिभाषित है
और भी:
5.2.2 फंक्शन कॉल
...
- [नोट: उपसर्ग अभिव्यक्ति और तर्कों के मूल्यांकन सभी एक दूसरे के सापेक्ष परिणामहीन हैं। तर्क के मूल्यांकन के सभी दुष्प्रभाव समारोह में प्रवेश करने से पहले अनुक्रमित होते हैं - अंतिम नोट]
तो अपनी लाइन के c.meth1(&nu).meth2(nu);
लिए, अंतिम कॉल के लिए फ़ंक्शन कॉल ऑपरेटर के संदर्भ में ऑपरेटर में क्या हो रहा है, इस पर विचार करें meth2
, इसलिए हम स्पष्ट रूप से पोस्टफिक्स अभिव्यक्ति और तर्क में टूट को देखते हैं nu
:
operator()(c.meth1(&nu).meth2, nu);
अंतिम फ़ंक्शन कॉल के लिए पोस्टफ़िक्स एक्सप्रेशन और तर्क का मूल्यांकन (यानी पोस्टफ़िक्स एक्सप्रेशन c.meth1(&nu).meth2
और nu
) उपरोक्त फ़ंक्शन कॉल नियम के अनुसार एक दूसरे के सापेक्ष अनियोजित हैं । इसलिए, स्केलर ऑब्जेक्ट पर पोस्टफिक्स एक्सप्रेशन की गणना के साइड-इफेक्ट को फ़ंक्शन कॉल से पहले के तर्क मूल्यांकन के सापेक्ष अनलोड किया जाता है । द्वारा प्रोग्राम निष्पादन ऊपर शासन, इस अपरिभाषित व्यवहार है।ar
nu
meth2
दूसरे शब्दों में, कॉल के बाद कॉल nu
करने के लिए तर्क का मूल्यांकन करने के लिए कंपाइलर की कोई आवश्यकता नहीं है - यह मूल्यांकन को प्रभावित करने के लिए कोई दुष्प्रभाव नहीं मानने के लिए स्वतंत्र है ।meth2
meth1
meth1
nu
उपरोक्त द्वारा निर्मित असेंबली कोड में main
फ़ंक्शन में निम्नलिखित अनुक्रम होते हैं :
- वैरिएबल
nu
को स्टैक पर आवंटित किया गया है और 0 से आरम्भ किया गया है।
- एक रजिस्टर (
ebx
मेरे मामले में) के मूल्य की एक प्रति प्राप्त करता हैnu
- के पते
nu
और c
पैरामीटर रजिस्टर में लोड किए गए हैं
meth1
कहा जाता है
- वापसी मान रजिस्टर और पहले से कैश की गई मूल्य की
nu
में ebx
रजिस्टर पैरामीटर रजिस्टरों में लोड किए गए हैं
meth2
कहा जाता है
गंभीर रूप से, संकलक के ऊपर चरण 5 में, nu
चरण 2 से कैश्ड मान को फ़ंक्शन कॉल में पुन: उपयोग करने की अनुमति देता है meth2
। यहाँ यह उस संभावना की अवहेलना करता nu
है जिसे कॉल द्वारा परिवर्तित किया जा सकता है meth1
- कार्रवाई में 'अपरिभाषित व्यवहार'।
नोट: यह उत्तर पदार्थ में मूल रूप से बदल गया है। ऑपरेंड गणना के साइड-इफेक्ट के संदर्भ में मेरा प्रारंभिक स्पष्टीकरण अंतिम फ़ंक्शन कॉल से पहले अनुक्रमित नहीं किया जा रहा था, क्योंकि वे हैं। समस्या यह तथ्य है कि खुद ऑपरेंड्स की गणना अनिश्चित काल के लिए की जाती है।