2010-11-01 11 views
11

निम्नलिखित (तुच्छ) कोड खंड पर विचार करें:थोड़ी देर के अंदर लूप के अंदर, आखिरी कॉमा से अलग स्टेटमेंट आखिरी बार चलाने की गारंटी है?

while (i++, i <= 10) { 
    // some more code 
} 

सामान्य स्थिति में, सी ++ अल्पविराम से अलग बयान किसी भी क्रम में मूल्यांकन किया जा सकता है। थोड़ी देर के लूप के मामले में, क्या हम कम से कम गारंटी (विनिर्देश के अनुसार) हैं कि आखिरी कथन (जिसे लूप के लिए स्थिति के रूप में उपयोग किया जाता है) का मूल्यांकन अंतिम रूप से किया जा सकता है?

+6

मुझे लगता है कि यह आपके बिंदु के बगल में है, लेकिन बस मामले में: आप उस स्थिति को 'i ++ <= 10' के रूप में फिर से लिख सकते हैं और अल्पविराम ऑपरेटर से छुटकारा पा सकते हैं। अब जाओ और मुझे बताओ कि यह आपके बिंदु के बगल में है। ':)' – sbi

+6

@ एसबीआई - क्या यह वही काम करता है? मैं उम्मीद करता था कि उपसर्ग के साथ लेकिन पोस्टफिक्स नहीं। अर्थात। '++ i, i <= 10'' ++ i <= 10' –

+0

@Steve जैसा ही है: आपने मुझे वहां पहुंचाया है। हां, यह '++ i <= 10' होना चाहिए। उसके लिए खेद है। (मुझे वास्तव में ऐसा करने का प्रयास नहीं करना चाहिए [चैटिंग] (http://chat.stackoverflow.com/rooms/10/c-lounge)।) – sbi

उत्तर

16

सामान्य स्थिति में, सी ++ किसी भी क्रम में अल्पविराम से अलग बयानों का मूल्यांकन करने की अनुमति देता है।

यदि आप फ़ंक्शन तर्कों के बीच अल्पविरामों का जिक्र कर रहे हैं, तो यह केवल एक विभाजक है।

अपने मामले में, आप अल्पविराम ऑपरेटर का उपयोग कर रहे हैं, और यह एक अनुक्रम बिंदु प्रस्तुत करता है जो गारंटी देता है कि अल्पविराम के बाएं ऑपरेंड से सभी दुष्प्रभाव सही मूल्यांकन करने से पहले बस गए हैं।

तो हाँ, यह अच्छी तरह से परिभाषित है।

खंड 5.18/1 आईएसओ सी ++ 98 मानक की ओर से:

अल्पविराम से अलग भाव की एक जोड़ी मूल्यांकन किया जाता है बाएँ-से-दाएँ और बाएँ अभिव्यक्ति के मूल्य खारिज कर दिया है। लवली-टू-रावल्यू (4.1), सरणी-टू-पॉइंटर (4.2), और फ़ंक्शन-टू-पॉइंटर (4.3) मानक रूपांतरण बाएं अभिव्यक्ति पर लागू नहीं होते हैं। अस्थायी अभिव्यक्ति के मूल्यांकन से पहले अस्थायी (12.2) के विनाश को छोड़कर बाएं अभिव्यक्ति के सभी दुष्प्रभाव (1.9) किए जाते हैं। परिणाम और परिणाम का मूल्य दाएं ऑपरेंड का प्रकार और मान है; इसका परिणाम एक लवल्यू है यदि इसका दायां ऑपरेंड है।

11

हां। , ऑपरेटर (जब तक ओवरलोड नहीं किया गया हो) एक तथाकथित अनुक्रम बिंदु प्रस्तुत करता है और वास्तव में बाएं से दाएं निष्पादन के आदेश की गारंटी देता है।

+3

... और विशेष रूप से संदर्भ (जैसे 'स्थिति' में) उपर्युक्त कथन से कोई फर्क नहीं पड़ता । – dmckee

1

उपरोक्त टिप्पणियों ने इसे समझाया। और इस विधि का दुरुपयोग करने के आम तरीका में से एक

while(scanf("%d", &n), n){ 
    // do something 
} 

जब तक हम शून्य पढ़ेगा यह पूर्णांक पढ़ा जाएगा।

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