बेशक यह अच्छी तरह से परिभाषित है।
इससे कोई फर्क नहीं पड़ता कि असाइनमेंट p=arr
कब होता है। आप p[0]
का मूल्यांकन नहीं कर रहे हैं, आप (p=arr)
के परिणाम को सब्सक्राइब कर रहे हैं, जो पॉइंटर मान है जिसे p
में संग्रहीत किया जा रहा है। चाहे इसे संग्रहीत किया गया हो या नहीं, फिर भी मूल्य नहीं बदलता है, और मूल्य p
को अभी तक संशोधित किया गया है या नहीं, भले ही मूल्य ज्ञात हो।
इसी प्रकार, *--p
में, कोई अपरिभाषित व्यवहार नहीं है। अनुक्रम बिंदुओं के बीच कम से कम एक लिख सहित, एक ही चर को दो बार एक्सेस किया गया था, तो केवल अपरिभाषित व्यवहार होगा। लेकिन p
को केवल --p
के हिस्से के रूप में उपयोग किया जाता है। इसे फिर से नहीं पढ़ा जाता है (*p
), dereferencing ऑपरेटर --p
के परिणाम पर लागू होता है जो एक अच्छी तरह से परिभाषित सूचक मान है। ,
void* a;
void* p = &a;
reinterpret_cast<void**>(p = &p)[0] = 0;
होगा के रूप में
int *pi = new int[5];
int i = **&++pi;
यह स्पष्ट किया जाना चाहिए कि एक preincrement का परिणाम एक पढ़ा लिखने के साथ अव्यवस्थित नहीं है:
अब, यह अपरिभाषित व्यवहार किया जाएगा क्योंकि यह कहने के लिए कि एक दौड़ है कि ++p
कभी भी एक रावल्यू के रूप में उपयोग नहीं किया जा सकता है, इस मामले में इसे अनुक्रम बिंदुओं के बीच अकेले खड़े रहना चाहिए, और बाद में वृद्धि के लिए इंस्टी का उपयोग किया जा सकता है विज्ञापन। भाषा में पूर्व वृद्धि और वृद्धि के बाद दोनों का कोई फायदा नहीं होगा।
स्रोत
2012-01-13 03:41:47
शीर्षक में कोड आपके द्वारा दिए गए कोड नमूने में प्रकट नहीं होता है। – porges
'((ए = बी) + एक्स) 'अच्छी तरह परिभाषित है? यदि यह अच्छी तरह से परिभाषित किया गया है, तो '(पी = एआर) [0]' अच्छी तरह से परिभाषित किया जाएगा, क्योंकि यह '* ((पी = एआर) + 0) के बराबर है ' – Nawaz
@P्रासून: आपके अनुसार तर्क, 'int x = ++ i + n' यूबी का आह्वान करता है? क्योंकि आपके अनुसार, कारण होना चाहिए: '++' का दुष्प्रभाव केवल अगले अनुक्रम बिंदु के बाद पूरा हो गया है और चूंकि हम '++ i' के परिणाम तक पहुंच रहे हैं, इसलिए कोड अच्छी तरह से गठित नहीं किया जा सकता है। क्या यह? – Nawaz