2012-12-05 20 views
11

संभव डुप्लिकेट के बराबर:
Could anyone explain these undefined behaviors (i = i++ + ++i , i = i++, etc…)
increment values in printfC/C++ में है एक्स [मैं] * y [i ++] हमेशा एक्स [मैं] * y [i]

मेरे पास दो डबल एरे x और y और पूर्णांक i है।

double res = x[i] * y[i++]; 

हमेशा बयान के बराबर है:: मेरा सवाल यह है कि बयान है

double res = x[i] * y[i]; 
i++; 

क्या यह संभव है कि कुछ compilers y[i++] * x[i] में x[i] * y[i++] बदल जाएगा, जो स्पष्ट रूप से अलग परिणाम पैदा करता है?

+0

इससे कोई फर्क क्यों पड़ता है? यदि आप एक विशिष्ट आदेश चाहते हैं, तो बस उस क्रम में लिखें। –

+0

@ बोपरसन। मैंने स्पष्टीकरण लिखना सोचा कि मुझे इसकी आवश्यकता क्यों है, लेकिन सवाल खराब नहीं करना चाहता था। जल्द ही, मुझे 'डबल vectors_dot_product (डबल * एक्स, डबल * वाई, int n);' फ़ंक्शन, और पाया कि 'x [i] * y [i ++] + x [i] * y [i ++] +। ..; 'x [i] * y [i] + x [i + 1] * y [i + 1] + ...;' – Serg

उत्तर

13

नहीं - x[i] + y[i++] में व्यवहार को अपरिभाषित किया गया है। आप i के मान को संशोधित कर रहे हैं और एक इंटरवेनिंग अनुक्रम बिंदु के बिना i मान का उपयोग कर रहे हैं, जो अपरिभाषित व्यवहार देता है।


  1. सी ++ 11 मानक में "अनुक्रम बिंदु" शब्दावली का सफाया कर दिया गया है, लेकिन प्रभाव ही रहता है - दोनों एक दूसरे के संबंध में अव्यवस्थित हैं।
+1

+1 सही भाषा के साथ पहला जवाब। – slebetman

+3

गुणात्मक ऑपरेटर की कम्यूटिटीविटी के साथ इसका कोई लेना-देना नहीं है। यदि ऑपरेशन 'x [i] - y [i ++]' (जिसे उलट नहीं किया जा सकता) था, तो इस स्थिति में 'i' का व्यवहार अभी भी अनिर्धारित नहीं होगा। –

8

नहीं, वृद्धि होने पर यह अनिर्धारित है।

+8

की तुलना में तेज़ है, जब वृद्धि होती है। व्यवहार ** पूरी तरह से ** अनिर्धारित है: यह 'i' को संशोधित करता है और बिना किसी अनुक्रमिक अनुक्रम बिंदु के अपने मूल्य को पढ़ता है। –

+1

@Pete: बढ़िया, पिज्जा डिलीवरी लड़का मेरे दरवाजे पर कब दिखाई देगा? ;) – fredoverflow

+2

@FredOverflow - अपने कंपाइलर विक्रेता से पूछें। –

1

नहीं है,

मूल्य की i ++ + i ++ C और C++ में undefined हैं।

यदि आप अभिव्यक्ति में दो बार एक चर पढ़ते हैं जहां आप इसे भी लिखते हैं, तो परिणाम अपरिभाषित होता है। ऐसा मत करो। एक और उदाहरण है:

v[i] = i++; 

अपरिभाषित इसका कंप्रेसर निवासी है।
कुछ कंपाइलर आपको मूल्यांकन के आदेश के रूप में भी अपरिभाषित के रूप में चेतावनी दे सकता है। एक के लिए सी ++

1http://www.stroustrup.com/bs_faq2.html#evaluation-order

+0

अभी भी कुछ काम की ज़रूरत है - 'v [i] = i ++;' अपरिभाषित है भले ही इसमें कोई फ़ंक्शन या गुजरने वाले तर्क शामिल न हों। –

+0

@GrijeshChauhan, लिंक के लिए धन्यवाद। – Serg

+0

@ सर्ग: स्वागत सर्ज! मुझे खुशी है अगर मैं मदद कर सकता हूं :) –

6

कोड i को संशोधित करता है और एक बीच के अनुक्रम बिंदु के बिना अपने मूल्य का उपयोग करता है, तो व्यवहार अपरिभाषित है बहुत अच्छा reference। भाषा परिभाषा यहां किसी भी आवश्यकता को लागू नहीं करती है।

+0

दिलचस्प है कि आप सभी लोगों के इस तथ्य का जिक्र नहीं करेंगे कि सी ++ 11 अब "अनुक्रम बिंदु" का उपयोग नहीं करता है। :-) –

+0

@ जेरीकॉफिन - कभी-कभी चीजों को सरल रखना बेहतर होता है। –

+0

+1। "यहां पर प्रवेश करने वाले सभी" विश्वास की त्याग के लिए कुछ कहा जाना है। –