2010-10-12 20 views
11

संभव डुप्लिकेट:
Could anyone explain these undefined behaviors (i = i++ + ++i , i = i++, etc…)अंतर = ++ मैं और ++ मैं

i = ++i; और ++i; जहां i मूल्य 10 साथ एक पूर्णांक है के बीच क्या अंतर है?

मेरे अनुसार i.e दोनों अभिव्यक्तियों के पूरा होने के बाद i =11 दोनों को पूरा करने के समान काम करते हैं।

+2

डुप्लिकेट? http://stackoverflow.com/questions/2902638/post-and-pre-increment-in-c-closed – rkellerm

उत्तर

10

i = ++i; अपरिभाषित व्यवहार का आह्वान करता है जबकि ++i; नहीं करता है।

सी ++ 03 [धारा 5/4] Between the previous and next sequence point a scalar object shall have its stored value modified at most once by the evaluation of an expression कहता है। इसलिए व्यवहार सी में साथ ही साथ C++ अपरिभाषित है

i = ++ii में किसी भी हस्तक्षेप अनुक्रम बिंदु के बिना दो बार [पूर्व वेतन वृद्धि और असाइनमेंट] संशोधित किया जा रहा है।

हालांकि i = ++i अच्छी तरह से C++ 0x :)

+5

प्रस्तुति के मूल्यांकन के आदेश से कोई लेना देना नहीं है। 'i = ++ i' यूबी को आमंत्रित करता है क्योंकि 'i' को दो अनुक्रम बिंदुओं के बीच एक से अधिक बार संशोधित किया जा रहा है। –

+0

क्या आप इस पर आधिकारिक स्रोत उद्धृत कर सकते हैं? निश्चित रूप से 'i = i ++' ने अपरिभाषित व्यवहार किया है: क्योंकि यह परिभाषित नहीं किया गया है कि 'i ++' का मान मुझे बढ़ाए जाने से पहले या बाद में कॉपी किया जाएगा या नहीं। लेकिन यह मेरे लिए कम स्पष्ट है कि 'i = ++ i' ऑर्डर-निर्भर परिणाम हैं। यह व्यवहार्य है लेकिन मेरे लिए स्पष्ट नहीं है। – LarsH

+0

@ प्र्रासून सौरव - अधिकांश, शायद सभी, कंपाइलर्स प्राथमिकता नियम का पालन करते हैं और इसे तार्किक मूल्य पर मूल्यांकन करते हैं। मुझे एहसास है कि आप http://www.cppreference.com/wiki/operator_precedence – DumbCoder

1

में परिभाषित किया गया है पहले एक के लिए परिणाम अनिर्धारित रहता है।

+0

यदि और केवल अगर ++ biult-in ++ ऑपरेटर है। यदि यह ओवरलैड किया गया है, तो यह अपरिभाषित व्यवहार नहीं है –

+0

@ आर्मेन: यही वह है जो मैं प्रसून के उत्तर पर कहने जा रहा था, फिर मैंने देखा कि प्रश्नकर्ता ने कहा था कि 'मैं' एक पूर्णांक था। मुझे लगता है कि यह मानना ​​उचित है कि इसका मतलब एक पूर्णांक प्रकार है, इसलिए यूबी। अनुक्रम बिंदुओं का उल्लेख करने के लिए –

7

लेखन i = ++i; लिखने के लिए दो बार (एक वृद्धि के लिए एक, असाइनमेंट के लिए एक) को sequence point दोनों के बीच लिखता है। यह, सी भाषा मानक के अनुसार अपरिभाषित व्यवहार का कारण बनता है।

इसका मतलब यह है संकलक i = ++ii = i + 1 के रूप में समान लागू करने के लिए, i = i + 2 के रूप में नि: शुल्क (यह वास्तव में कुछ pipeline- और कैश से संबंधित परिस्थितियों में समझ में आता है), या format C:\ के रूप में (मूर्ख, लेकिन तकनीकी रूप मानक द्वारा अनुमति)।

+0

+1, कुछ ऐसा जो बहुत उपयोगी है! अनुक्रम बिंदुओं के वर्णन के लिए एक लिंक देने के लिए –

+0

+1। – LarsH

3

i = ++ मैं अक्सर होगा, लेकिन जरूरी नहीं कि,

का परिणाम दे मैं = मैं;

i +1; जो मैं देता

= 10

के रूप में टिप्पणी से कहे अनुसार, इस अपरिभाषित व्यवहार है और

पर कभी नहीं भरोसा किया जाना चाहिए, जबकि ++ मैं हमेशा

दे देंगे मैं = मैं +1;

जो i = 11 देता है;

और इसलिए कर रही है यह

+0

यदि आप मुझे कम करते हैं, तो कम से कम मेरे पोस्ट – kskjon

+0

के साथ क्या गलत था यह बताने की सौजन्य है कि मैंने आपको कम नहीं किया है, लेकिन ऐसा इसलिए हो सकता है क्योंकि आपका उत्तर कमजोर है, कह रहा है कि यह "अक्सर, लेकिन जरूरी नहीं" निश्चित परिणाम यह आधिकारिक रूप से अपरिभाषित व्यवहार है, और अनुमान लगाने की कोशिश कर रहा है * जिस नतीजे के बारे में आप प्राप्त करने जा रहे हैं, वह केवल एक पाठक को गलत विचार दे सकता है, कि परिणाम पर भरोसा करना किसी भी तरह से संभव है। – jalf

+0

@jalf - मैं kskjon के उत्तर के साथ कुछ भी गलत नहीं देख सकता। यह अधिकतम सटीक नहीं है लेकिन यह पूरी तरह से सटीक है, और यह ओपी के प्रश्न का उत्तर देता है। kskjon यह स्पष्ट करता है कि i = 10 परिणाम "जरूरी नहीं" होगा। मैं नहीं देखता कि यह एक पाठक को एक गलत विचार कैसे दे सकता है कि उस परिणाम पर भरोसा करना किसी भी तरह से संभव है। – LarsH

1

ये भाव sequence points से संबंधित हैं का सही तरीका, undefined behavior में पहली एक परिणाम है और सबसे महत्वपूर्ण।

2

यदि मैं स्केलर प्रकार का है, तो i = ++i यूबी है, और ++ii+=1 के बराबर है। अगर मैं वर्ग प्रकार का है और वहाँ एक ऑपरेटर ++ उस वर्ग के लिए अतिभारित है तो i = ++i बराबर i.operator=(operator++(i)) है, जो यूबी नहीं है, और ++i सिर्फ ++ operator, जो भी अर्थ विज्ञान के साथ आप इसे में डाल निष्पादित होता है।

संबंधित मुद्दे