सबसे पहले
, आधुनिक सी ++ "अनुक्रम अंक" के पुराने (अपर्याप्त) अवधारणा से पर स्विच किया गया है "अनुक्रमण" की नई अवधारणा (यानी "अनुक्रमित", "अनुक्रमित")। जबकि i = i++
अभी भी अपरिभाषित है, i = ++i
वास्तव में अब पूरी तरह से परिभाषित किया गया है। कई lvalue-returning ऑपरेटरों में अनुक्रम नियमों का पुनर्वितरण किया गया था।
दूसरा, आपका संस्करण पुराने विनिर्देश के साथ-साथ नए के तहत सुरक्षित है। फ़ंक्शन के अंदर i
का संशोधन असाइनमेंट से i
पर सुरक्षित रूप से "पृथक" है। शुरुआत में और फ़ंक्शन के अंत में क्लासिक विनिर्देश अनुक्रम बिंदुओं में एक दूसरे से i
के संशोधनों (और पढ़ने) को सुरक्षित रूप से अलग कर दिया गया। नए अनुक्रमण नियम भी सुरक्षा के समान स्तर को संरक्षित करते हैं।
एक उदाहरण है कि एक समारोह कॉल द्वारा प्रदान के रूप में
int inc(int &i) { return i++; }
...
int i = 1;
int r1 = i++ * i++ * i++;
// Undefined behavior because of multiple unsequenced side effects
// applied to the same variable
int r2 = inc(i) * inc(i) + inc(i);
// No UB, but order of evaluation is unspecified. Since the result
// depends on the order of evaluation, it is unspecified
int r3 = inc(i) + inc(i) + inc(i);
// Perfectly defined result. Order of evaluation is still unspecified,
// but the result does not depend on it
क्या संकलक बताता है इस प्रकार है लग सकता है सुरक्षा को दिखाता है? – tristan
@tristan आम तौर पर, कंपाइलर यूबी के बारे में कुछ भी नहीं बताता है। – user2079303
जीसीसी में 'परिणाम-बिंदु' विकल्प – tristan