2010-10-18 33 views
23

मैंने हाल ही में , ऑपरेटर के बारे में सीखा और यह तथ्य कि यह अनुक्रम बिंदु प्रस्तुत करता है।क्या मैं = 0, ++ परिभाषित किया गया है?

मैं यह भी पता चला निम्नलिखित कोड अपरिभाषित व्यवहार करने के लिए नेतृत्व कि:

i = ++i; 

क्योंकि i दो अनुक्रम अंक के बीच दो बार संशोधित किया गया था।

लेकिन निम्नलिखित कोडों के बारे में क्या?

i = 0, ++i; 
i = (0, ++i); 

जबकि मैं नियमों को जानता हूं, मैं निष्कर्ष तक नहीं पहुंच सकता। तो क्या यह परिभाषित व्यवहार है या नहीं?

संपादित करें: बस के रूप में @paxdiablo का उल्लेख है, परिभाषित या नहीं, यह वास्तव में एक बुरा व्यवहार जो बचा जाना चाहिए है। यह प्रश्न पूरी तरह से शैक्षणिक उद्देश्यों और "नियमों" की बेहतर समझ के लिए कहा जाता है।

+21

मुझे नहीं पता _why_ लोग इस तरह के प्रश्न पूछते रहते हैं। इससे कोई फर्क नहीं पड़ता कि यह अपरिभाषित है, यह क्रैपी कोड है। आपको इसका उपयोग, परिभाषित या अन्यथा _never_ करना चाहिए। – paxdiablo

+10

@paxdiablo: क्या आपको सच में लगता है कि मैं वास्तविक कोड में ऐसे बेकार कथन का उपयोग करूंगा? यह केवल नियमों को बेहतर समझने के बारे में है। और कुछ नहीं। – ereOn

+0

@ereOn नियमों को सीखना अच्छा है, यह सच है। लेकिन थोड़ी देर के अनुभव के बाद आम तौर पर किसी भी संरचना से बचने के लिए कोडर की ओर जाता है जो सभी प्लेटफार्मों में अच्छी तरह से परिभाषित नहीं होते हैं। –

उत्तर

27

हां। = की , से अधिक प्राथमिकता है, इसलिए यह अभिव्यक्ति (i = 0), ++i के बराबर है। , एक अनुक्रम बिंदु है, इसलिए यह गारंटी है कि ++i असाइनमेंट के बाद होता है।

मुझे यकीन नहीं है कि i = (0, ++i) को परिभाषित किया गया है या नहीं। मेरा अनुमान नहीं होगा; वृद्धि और असाइनमेंट के बीच कोई अनुक्रम बिंदु नहीं है।

+0

मैं एक ही अंतर्ज्ञान के लिए आया लेकिन तथ्य यह है कि मैं निश्चित रूप से मुझे परेशान नहीं कर सकता। धन्यवाद। – ereOn

+0

@ereOn: मेरा अंतर्ज्ञान यह है कि मानक इसकी गारंटी नहीं देता है, यह अपरिभाषित है। –

+0

ब्रांड्स के कारण, असाइनमेंट का मूल्यांकन असाइनमेंट से पहले किया जाएगा, इसलिए मुझे लगता है कि यह अपरिभाषित होगा। – codymanix

7
i = 0, ++i; 

जैसा कि दूसरे उत्तर ने बताया कि यह अनिर्धारित व्यवहार नहीं है।

i = (0, ++i); 

व्यवहार इस मामले में अपरिभाषित क्योंकि ++i और मैं करने के लिए काम के बीच कोई अनुक्रम बिंदु है वहाँ है।

i = (0, ++i, 0) 

व्यवहार अच्छी तरह से सी ++ 03, IMHO में परिभाषित किया गया है।

इसी तरह की अभिव्यक्ति के लिए extended discussion देखें।

+1

+1। सरल और सही। – Nawaz

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