के रूप में अन्य लोगों ने बताया है, व्यवहार undefined है:
6,5 भाव
...
पिछले और अगले अनुक्रम बिंदु एक वस्तु अपने संग्रहीत मूल्य ज्यादा से ज्यादा संशोधित होगा बीच 2 एक बार अभिव्यक्ति के मूल्यांकन के द्वारा।
72) इसके अलावा, पूर्व मान केवल संग्रहीत करने के मान को निर्धारित करने के लिए पढ़ा जाएगा।
73)
...
72) एक फ़्लोटिंग-पॉइंट स्थिति ध्वज एक वस्तु नहीं है और अभिव्यक्ति के भीतर एक से अधिक बार सेट किया जा सकता है। 73) इस पैरा जबकि (अगले अनुक्रम बिंदु से पहले
i
दो बार में निहित मूल्य को संशोधित करने के इस मामले में
i = i + 1;
a[i] = i;
अभिव्यक्ति i = ++i % 3
प्रयास की इजाजत दी ऐसी
i = ++i + 1;
a[i++] = i;
के रूप में अपरिभाषित बयान भाव प्रस्तुत हुई है,
;
बयान समाप्त करना), एक बार
++i
का मूल्यांकन करके, और एक बार बड़ी असाइनमेंट अभिव्यक्ति का मूल्यांकन करके।
अब, यह एक समस्या क्यों होगी? आखिरकार, सी # और जावा इन अभिव्यक्तियों को ठीक से संभाल सकते हैं।
समस्या यह है कि, कुछ अपवादों के साथ, सी गारंटी नहीं देता है कि अभिव्यक्ति में संचालन किसी विशेष क्रम में मूल्यांकन किया जाता है, या अभिव्यक्ति के मूल्यांकन के तुरंत बाद अभिव्यक्ति के साइड इफेक्ट्स लागू किए जाएंगे (सी # और जावा, जो गारंटी देता है)।उदाहरण के लिए, ++i
अभिव्यक्ति परिणाम (i
+ 1) और साइड इफेक्ट (i
में संग्रहीत मान को बढ़ाएं); हालांकि, साइड इफेक्ट को तब तक स्थगित कर दिया जा सकता है जब तक कि बड़ी अभिव्यक्ति का मूल्यांकन नहीं किया जाता है। IOW, कार्यों के निम्नलिखित अनुक्रम की अनुमति है:
t0 = i + 1
t1 = t0 % 3
i = t1
i = i + 1
ओप्सी। हम क्या चाहते थे नहीं।
यह एक जानबूझकर डिजाइन निर्णय था; विचार यह है कि यह संकलक को इष्टतम तरीके से मूल्यांकन को पुन: व्यवस्थित करने की अनुमति देता है (एक मूल्य का लाभ उठाकर जो पहले से ही एक रजिस्टर में है) कहें। नकारात्मकता यह है कि अभिव्यक्तियों के कुछ संयोजनों के अप्रत्याशित परिणाम होंगे।
स्रोत
2011-10-24 18:30:01
* ऑपरेशन * अपरिभाषित है, न कि मैं स्वयं। अर्थात। यह अपरिभाषित व्यवहार है। ऐसा मत करो –
@ पॉल आर आपको क्यों लगता है कि ऑपरेशन अपरिभाषित है? ++ मैं 1 तक बढ़ता हूं और 3 के साथ मॉड्यूलो ओपेरटर 1 परिणाम के रूप में 1 देता है। क्या वह काम नहीं करता है? – niko
@niko: मेरा उत्तर देखें और http://www.catb.org/jargon/html/N/nasal-demons.html –