तकनीकी रूप से, यह समग्र रूप से अपरिभाषित व्यवहार है ।
लेकिन, उत्तर के दो महत्वपूर्ण पहलू हैं।
कोड स्टेटमेंट:
std::cout << a++ << a;
इस रूप में मूल्यांकन किया जाता है:
std::operator<<(std::operator<<(std::cout, a++), a);
मानक किसी फ़ंक्शन के लिए तर्कों के मूल्यांकन के क्रम को परिभाषित नहीं करता है।
तो या तो:
std::operator<<(std::cout, a++)
पहले मूल्यांकन किया है या
a
पहले मूल्यांकन किया है या
- यह कोई भी कार्यान्वयन परिभाषित आदेश हो सकता है।
यह आदेश मानक के अनुसार अनिर्दिष्ट [Ref 1] है ।
[Ref १] C ++ ०३.२.२ फंक्शन कॉल पैरा ++
तर्कों के मूल्यांकन का क्रम अनिर्दिष्ट है । फ़ंक्शन में प्रवेश करने से पहले तर्क अभिव्यक्ति मूल्यांकन के सभी दुष्प्रभाव। उपसर्ग अभिव्यक्ति और तर्क अभिव्यक्ति सूची के मूल्यांकन का क्रम अनिर्दिष्ट है।
इसके अलावा, किसी फ़ंक्शन के लिए तर्कों के मूल्यांकन के बीच कोई अनुक्रम बिंदु नहीं है, लेकिन सभी तर्कों [Ref 2] के मूल्यांकन के बाद ही एक अनुक्रम बिंदु मौजूद है ।
[Ref 2] C ++ 03 1.9 कार्यक्रम निष्पादन [intro.execution]:
पैरा 17:
किसी फ़ंक्शन को कॉल करना (फ़ंक्शन फ़ंक्शन इनलाइन है या नहीं), सभी फ़ंक्शन तर्क (यदि कोई हो) के मूल्यांकन के बाद एक अनुक्रम बिंदु है जो फ़ंक्शन बॉडी में किसी भी अभिव्यक्तियों या बयानों के निष्पादन से पहले होता है।
ध्यान दें कि, यहाँ का मान c
बिना किसी हस्तक्षेप के अनुक्रम बिंदु के बिना एक से अधिक बार पहुँचा जा रहा है, इस बारे में मानक कहते हैं:
[रेफरी ३] सी ++ ०३ ५ एक्सप्रेशंस [एक्सप्र]:
पैरा ४:
....
पिछले और अगले अनुक्रम के बीच एक स्केलर ऑब्जेक्ट में एक अभिव्यक्ति के मूल्यांकन द्वारा एक बार में इसका संग्रहित मूल्य संशोधित होगा। इसके अलावा, मूल्य को संग्रहीत करने के लिए केवल निर्धारित करने के लिए पूर्व मूल्य को एक्सेस किया जाएगा । इस अनुच्छेद की आवश्यकताओं को पूर्ण अभिव्यक्ति के सबएक्सप्रेस के प्रत्येक स्वीकार्य आदेश के लिए पूरा किया जाएगा; अन्यथा व्यवहार अपरिभाषित है ।
कोड c
अनुक्रम बिंदु के बिना एक से अधिक बार संशोधित करता है और संग्रहीत वस्तु के मूल्य को निर्धारित करने के लिए इसे एक्सेस नहीं किया जा रहा है। यह उपर्युक्त खंड का स्पष्ट उल्लंघन है और इसलिए मानक के अनुसार अनिवार्य परिणाम अपरिभाषित व्यवहार है [Ref 3] ।