2010-11-05 20 views
5

निम्नलिखित दी गई अभिव्यक्ति अपरिभाषित व्यवहार का आह्वान क्यों करती है?यह अनिर्धारित व्यवहार क्यों है?

int i = 5; 
i = (i,i++,i) + 1 

मेरा प्रश्न से प्रभावित है ए एल एस 'question here

+0

क्या यह प्रश्न चर्चा में कुछ भी जोड़ता है? – KevinDTimm

+0

अपरिभाषित व्यवहार का क्या अर्थ है। –

+1

जिज्ञासा से बाहर: '(i, i ++, i) 'का अर्थ क्या है? क्या यह एक सूची है? – sleske

उत्तर

11

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

यहां सी के लिए उत्तर दिया, Sequence points and partial order

मुझे लगता है कि एक ही सी में लागू होता है ++ (और यहाँ मेरी प्रतिक्रिया से पहले मैं उस लिंक को देखा है):

अल्पविराम ऑपरेटर एक दृश्य बिंदु का परिचय (और कुछ हद तक तक रोकें जिस क्रम में अभिव्यक्ति मूल्यांकन किया जाना चाहिए - सही से पहले छोड़ दिया है), इसलिए:

  • i के दो संशोधनों एक दृश्य बिंदु (दूसरा अल्पविराम) से अलग कर दिया जाता है।
  • में i++ में संशोधन अनुक्रम बिंदुओं से बाकी सब कुछ से अलग किया गया है।
  • = द्वारा i के संशोधन अभिव्यक्ति में i के अंतिम घटना से अलग नहीं है, लेकिन यह ठीक है क्योंकि हम एक बीच के अनुक्रम बिंदु के बिना i पहुँच सकते हैं और इसे संशोधित करने की अनुमति है, बशर्ते कि पहुँच है " संग्रहीत करने के लिए मूल्य निर्धारित करने के लिए "(5/4)।
  • ए एल एस कहते हैं, व्यवहार में इससे कोई फर्क नहीं होता है कि कोड व्यवहार परिभाषित किया गया है या कि हर कोई बुनियादी सामान्य ज्ञान था यह ;-)
+0

केवल इस तथ्य को ध्यान में रखते हुए कि, 'एक अनुक्रम बिंदु है, हां। दुर्भाग्यवश मानक इस बारे में बहुत सावधान है: 'ध्यान दें कि सार मशीन में अनुक्रमण के कुछ पहलुओं को निर्दिष्ट नहीं किया गया है; साइड इफेक्ट्स पर पिछले प्रतिबंध उस विशेष निष्पादन अनुक्रम पर लागू होता है जिसमें वास्तविक कोड उत्पन्न होता है। ' –

+0

मैं जवाब देना चाहता था लेकिन मैंने नहीं किया। [फिर भी एक और अपरिभाषित व्यवहार प्रश्न] ;-) –

+0

@Let_Me_Be: मैं स्वीकार करता हूं कि मैं उस फुटनोट को समझ नहीं पा रहा हूं। निष्पादन अनुक्रम में "वास्तविक कोड" उत्पन्न होने का क्या अर्थ है? –

0

क्योंकि यह मानक में निर्धारित नहीं है के बाद वेतन वृद्धि या काम पहली जगह ले जाएगा जो; यह उनके आदेश का फैसला करने के लिए संकलक कार्यान्वयन के लिए छोड़ दिया गया है।

0

यह C++ अपरिभाषित है आवंटित करने के लिए लिखने के लिए नहीं प्रदान नहीं की है कि क्या खुद के लिए एक वृद्धि मूल्य:

i = i++ 

i इसके बाद क्या होना चाहिए? क्या यह पिछले मान या एक प्लस पिछले मूल्य होना चाहिए? निष्पादन का आदेश कंपाइलर को छोड़ दिया गया है, इसलिए अलग-अलग प्लेटफार्मों के अलग-अलग परिणाम होंगे।

+0

मुझे पूरा यकीन है कि 'i' इसके बाद अपरिवर्तित रहना चाहिए। अनुक्रम बिंदु की वजह से यह अभी भी तकनीकी रूप से अपरिभाषित व्यवहार है, लेकिन कुछ अन्य परिणाम होने का कोई तरीका नहीं है। –

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