2013-06-18 7 views
11

मुझे इसके लिए एक निश्चित उत्तर नहीं मिल रहा है: क्या निम्न कोड में व्यवहार को अपरिभाषित किया गया है?एक कथन में एकाधिक यौगिक असाइनमेंट: क्या यह अनिर्धारित व्यवहार है या नहीं?

int x = 2; 
x+=x+=x+=2.5; 
+0

यह * डुप्लिकेट नहीं है। यहां अभिव्यक्ति 'x + = (x + = 10) 'है, जो' (x + = 10) + = 10' से अलग है - यहां व्यवहार अपरिभाषित है जहां दूसरा प्रश्न नहीं है (सी ++ 11 में)। – interjay

+0

मेरी उपरोक्त टिप्पणी प्रश्न को संदर्भित करती है [सी ++ मानक के कौन से संस्करणों में "(i + = 10) + = 10" अपरिभाषित व्यवहार है?] (Http://stackoverflow.com/questions/10655290/in-which-versions -of-the-c-standard-does-i-10-10-have-undefined-behaviou) जिसे पहले डुप्लिकेट के रूप में चिह्नित किया गया था। – interjay

+0

आप वास्तव में क्यों जानना चाहते हैं? – Alex

उत्तर

14

व्यवहार अपरिभाषित है। के थोड़ा सरल अभिव्यक्ति पर नजर डालते हैं:

x += (x+=1) 

सी ++ 11 में, छोड़ दिया x का मूल्य गणना अभिव्यक्ति (x+=1) का मूल्य गणना करने के लिए unsequenced सापेक्ष है। इसका मतलब है कि x की मान गणना x (x+=1 के कारण) के असाइनमेंट के सापेक्ष अपरिचित है, और इसलिए व्यवहार अपरिभाषित है।

इसका कारण यह है कि += ऑपरेटर के दोनों किनारों की मान गणना एक दूसरे के सापेक्ष अपरिचित है (मानक मानक अन्यथा निर्दिष्ट नहीं करता है)। और 1.9p15 कहता है: एक अदिश वस्तु पर एक पक्ष प्रभाव एक ही अदिश वस्तु पर या तो एक और पक्ष प्रभाव या एक मूल्य गणना एक ही अदिश वस्तु के मूल्य का उपयोग करने के लिए unsequenced रिश्तेदार है

हैं, व्यवहार अनिर्धारित रहता है।

सी ++ 03 में व्यवहार अपरिभाषित है क्योंकि x बिना किसी मध्यवर्ती अनुक्रम बिंदु के दो बार संशोधित किया गया है।

+2

नोट: यदि उपयोगकर्ता द्वारा परिभाषित 'ऑपरेटर + =' के साथ 'x' कोई ऑब्जेक्ट था, तो इसे परिभाषित किया जाएगा ... –

+0

पहले इसे डाउनवॉट करने के लिए खेद है। जैसा कि आपने प्रश्न पर अपनी टिप्पणी में बताया है, दो अभिव्यक्ति अलग हैं और वास्तव में आपका उत्तर पूरी तरह से सही है। +1 –

0

मानक उद्धरणों के लिए अन्य उत्तरों देखें। इस मामले में दो अलग-अलग व्यवहारों में से एक को खोजने की संभावना है।

x += (x += 2); 

या तो

x = 2 + 4 (= 6) 

हो सकता है अगर बाईं ऑपरेटर के लिए एक्स का मान बाद में निर्धारित किया जाता है, तो बाईं ओर एक्स का मान से पहले x+=2 या

x = 4 + 4 (= 8) 

मूल्यांकन किया जाता है।


-edit-

मैं अगर मैं कहूं मुझे पसंद नहीं है उन "कुछ भी हो सकता है" का दावा है बहुत ज्यादा मैं इतने पर कई प्रशंसकों को नहीं करने वाले जानते हैं। यह सच है कि किसी भी कंपाइलर को मानक मानदंड घोषित कर सकते हैं कि इस पर ध्यान दिए बिना कि हम जिस कथन पर चर्चा करते हैं, उसे एक्स के मूल्य के संबंध में कैसे संभाला जाता है। फिर भी, मुझे लगता है कि इसका मतलब यह नहीं है कि ऑपरेटर + = का परिणाम गलत परिणाम हो सकता है या पैराथेस को अनदेखा किया जा सकता है। अपरिभाषित व्यवहार किसी भी अन्य मामले में अपरिभाषित व्यवहार के समान नहीं है।

यह मूल्यांकन के बाद अपरिभाषित व्यवहार के बारे में किसी भी उम्मीद पर वापस करने के लिए, लेकिन ऊपर के उदाहरण में मैं किसी भी संभावित परिणाम लेकिन 6 और 8

इसके अलावा उपेक्षा के लिए अच्छा कारण भी देख मैं वास्तव में संदिग्ध x 8 होने के लिए बुरा है अधिकांश स्थापित कंपाइलर्स (क्लैंग, जी ++, वीसी, आईसीपीसी ...) के लिए int x=2; x += (x += 2); का।

यह फिर से कहा जाना चाहिए कि आपको इस तरह के व्यवहार पर भरोसा नहीं करना चाहिए, लेकिन इसका मतलब यह नहीं है कि यह पूरी तरह से अप्रत्याशित है।

+4

** कम से कम ** दो व्यवहार यहां हो सकते हैं। व्यवहार अपरिभाषित है, इसलिए संभावित व्यवहारों का आकलन करना एक अंतहीन कार्य है। –

+0

यह दिखाने के बीच एक अंतर है कि कम से कम दो अलग-अलग परिणाम मौजूद हैं (विरोधाभास द्वारा दिखाया गया) गणना करने के लिए। मामले 2 के लिए ये समान हैं। – Alex

+1

अनुकूलित कंपिलरों को * मान लीजिए * कि आपके प्रोग्राम का व्यवहार अपरिभाषित नहीं है। यदि आप उस धारणा का उल्लंघन करते हैं, तो वे * आपके * धारणाओं का उल्लंघन करने वाले परिवर्तनों को निष्पादित कर सकते हैं। किसी भी मामले में, यह वास्तव में कोई फर्क नहीं पड़ता कि कैसे 'x + = (x + = 2); 'व्यवहार करता है; जो भी इसका मतलब है, इसे व्यक्त करने का एक स्पष्ट तरीका है। –

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