इससे पहले कि आप अपरिभाषित व्यवहार शुरू करें, यह स्पष्ट रूप से N4659 (C ++ 17) में सूचीबद्ध है।
i = i++ + 1; // the value of i is incremented
फिर भी N3337 में (C ++ 11)
i = i++ + 1; // the behavior is undefined
किया बदल गया?
मैं [N4659 basic.exec] से क्या इकट्ठा कर सकता हूं
जहां नोट किया गया है, सिवाय इसके कि अलग-अलग संचालकों के संचालनों का मूल्यांकन और अलग-अलग अभिव्यक्तियों के उप-वर्गों का मूल्यांकन न किया जाए। [...] एक ऑपरेटर के ऑपरेंड्स के मूल्य गणना ऑपरेटर के परिणाम के मूल्य गणना से पहले अनुक्रमित किए जाते हैं। यदि किसी स्मृति स्थान पर कोई साइड इफेक्ट एक ही मेमोरी लोकेशन पर किसी अन्य साइड इफेक्ट या एक ही मेमोरी लोकेशन में किसी भी वस्तु के मूल्य का उपयोग करते हुए एक मूल्य संगणना के सापेक्ष अनुपलब्ध है, और वे संभावित रूप से समवर्ती नहीं हैं, तो व्यवहार अपरिभाषित है।
जहां मूल्य को [N4659 basic.type] पर परिभाषित किया गया है
तुच्छ रूप से कॉपी करने योग्य प्रकारों के लिए, मूल्य प्रतिनिधित्व वस्तु प्रतिनिधित्व में बिट्स का एक सेट है जो एक मूल्य निर्धारित करता है , जो मूल्यों के कार्यान्वयन-परिभाषित सेट का एक असतत तत्व है
जहां नोट किया गया है, सिवाय इसके कि अलग-अलग संचालकों के संचालनों का मूल्यांकन और अलग-अलग अभिव्यक्तियों के उप-वर्गों का मूल्यांकन न किया जाए। [...] एक ऑपरेटर के ऑपरेंड्स के मूल्य गणना ऑपरेटर के परिणाम के मूल्य गणना से पहले अनुक्रमित किए जाते हैं। यदि एक स्केलर ऑब्जेक्ट पर एक साइड इफेक्ट एक ही स्केलर ऑब्जेक्ट पर या तो एक और साइड इफेक्ट के लिए एक साइड इफेक्ट या एक ही स्केलर ऑब्जेक्ट के मूल्य का उपयोग करते हुए एक मूल्य गणना के सापेक्ष अप्रभावित है, तो व्यवहार अपरिभाषित है।
इसी तरह, मूल्य को [N3337 basic.type] पर परिभाषित किया गया है
तुच्छ रूप से प्रतिलिपि योग्य प्रकारों के लिए, मूल्य प्रतिनिधित्व वस्तु प्रतिनिधित्व में बिट्स का एक सेट है जो एक मूल्य निर्धारित करता है , जो कि मूल्यों के कार्यान्वयन-निर्धारित सेट का एक असतत तत्व है।
वे समरूपता के उल्लेख को छोड़कर समान हैं जो कोई फर्क नहीं पड़ता, और स्केलर ऑब्जेक्ट के बजाय मेमोरी लोकेशन के उपयोग के साथ , जहां
अंकगणित प्रकार, गणना प्रकार, सूचक प्रकार, सदस्य प्रकारों के लिए सूचक
std::nullptr_t
, और इन प्रकारों के cv- योग्य संस्करणों को सामूहिक रूप से स्केलर प्रकार कहा जाता है।
जो उदाहरण को प्रभावित नहीं करता है।
असाइनमेंट ऑपरेटर (=) और कंपाउंड असाइनमेंट ऑपरेटर सभी ग्रुप को राइट-टू-लेफ्ट करते हैं। सभी को अपने बाएं ऑपरेंड के रूप में एक परिवर्तनीय अंतराल की आवश्यकता होती है और बाएं ऑपरेंड का जिक्र करते हुए एक अंतराल वापस करता है। सभी मामलों में परिणाम एक बिट-फ़ील्ड है यदि बाएं ऑपरेंड थोड़ा-फ़ील्ड है। सभी मामलों में, असाइनमेंट को दाएं और बाएं ऑपरेंड्स के मूल्य गणना के बाद, और असाइनमेंट अभिव्यक्ति के मूल्य गणना से पहले अनुक्रमित किया जाता है। दाहिने ऑपरेंड को बाएं ऑपेंड से पहले अनुक्रमित किया जाता है।
असाइनमेंट ऑपरेटर (=) और कंपाउंड असाइनमेंट ऑपरेटर सभी ग्रुप को राइट-टू-लेफ्ट करते हैं। सभी को अपने बाएं ऑपरेंड के रूप में एक परिवर्तनीय अंतराल की आवश्यकता होती है और बाएं ऑपरेंड का जिक्र करते हुए एक अंतराल वापस करता है। सभी मामलों में परिणाम एक बिट-फ़ील्ड है यदि बाएं ऑपरेंड थोड़ा-फ़ील्ड है। सभी मामलों में, असाइनमेंट को दाएं और बाएं ऑपरेंड्स के मूल्य गणना के बाद, और असाइनमेंट अभिव्यक्ति के मूल्य गणना से पहले अनुक्रमित किया जाता है।
N3337 में अंतिम वाक्य अनुपस्थित होने का एकमात्र अंतर है।
हालांकि अंतिम वाक्य का कोई महत्व नहीं होना चाहिए क्योंकि बाएं ऑपरेंड i
न तो "एक और साइड इफेक्ट" है और न ही "समान स्केलर ऑब्जेक्ट के मूल्य का उपयोग" के रूप में आईडी-एक्सप्रेशन एक अंतराल है।
i = i++ + 1;
।