2010-10-28 17 views
10

क्या मैं बूलियन अभिव्यक्ति के दोनों किनारों पर x का उपयोग कर सकता हूं जब मैं इसे बाईं तरफ बढ़ाता हूं?क्या सी ++ में 'x--> 0 && सरणी [x]' अच्छी तरह से परिभाषित व्यवहार है?

प्रश्न में लाइन है:

if(x-- > 0 && array[x]) { /* … use x … */ } 

कि मानक के माध्यम से परिभाषित कर रहा है? सरणी [x] x या पुराने वाले के नए मान का उपयोग करेगी?

+6

दूसरों को पढ़ने के लिए अपने कोड को साफ रखना याद रखें, भले ही अच्छी तरह से परिभाषित किया गया हो, अगर कोई बाद में अभिव्यक्ति को बदलता या जोड़ता है तो यह कोई समस्या उत्पन्न कर सकता है। बस मेरे 2 सी –

+5

भले ही इसे अच्छी तरह से परिभाषित किया जा सके, आपको इस तरह के कोड का उपयोग नहीं करना चाहिए। जैसा कि आप इसे लिखते हैं, आप इसे समझ सकते हैं, लेकिन अगला पेसन नहीं हो सकता है। – codymanix

+0

यह कोड सभी के बाद बहुत बुरा नहीं है। मैंने लिनक्स कर्नेल में खराब कोड देखा है: डी – knittl

उत्तर

12

यह निर्भर करता है।

यदि && सामान्य शॉर्ट-सर्किटिंग लॉजिकल ऑपरेटर है, तो यह ठीक है क्योंकि अनुक्रम बिंदु है। array[x] नए मान का उपयोग करेगा।

तो && उपयोगकर्ता (या पुस्तकालय) में परिभाषित किया अतिभारित ऑपरेटर है, तो कोई शॉर्ट सर्किट, और यह भी x-- के मूल्यांकन और array[x] के मूल्यांकन के बीच एक दृश्य बिंदु की कोई गारंटी नहीं है। यह आपके कोड को असंभव रूप से नहीं दिखता है, लेकिन संदर्भ के बिना निश्चित रूप से कहना संभव नहीं है। मुझे लगता है कि array की सावधानीपूर्वक परिभाषा के साथ, इसे व्यवस्थित करना संभव है।

यही कारण है कि operator&& अधिभारित करना लगभग हमेशा एक बुरा विचार है।

वैसे, if ((x > 0) && array[--x]) का एक बहुत ही समान प्रभाव है (फिर से, कोई ऑपरेटर अधिभार शेंगेनिंग नहीं करता है), और मेरी राय में स्पष्ट है। अंतर यह है कि x पिछले 0 में कमी आई है, जिसे आप भरोसा कर सकते हैं या नहीं।

+0

जब से आप 'ऑपरेटर &&' को अधिभारित कर सकते हैं? – zwol

+0

यह बुलियन ऑपरेटर है && और यह – knittl

+0

@Steve ओवरलोड नहीं किया गया है: भले ही && ओवरलोड हो गया हो, फिर भी यह व्यवहार परिभाषित किया जाएगा, नहीं? –

11

हां, यह अच्छी तरह से परिभाषित है। && एक अनुक्रम बिंदु प्रस्तुत करता है।

+1

हू, मुझे यह महसूस हो रहा है कि आप या अन्य लोग इतने कमजोर तेज़ जवाब देने के लिए ट्विटर जैसे कुछ फ़ीड का उपयोग कर रहे हैं। जब मैं पहली बार एक प्रश्न देखता हूं तो इसका आमतौर पर उत्तर दिया जाता है ...? –

+0

@ एएलएफ पी। स्टीनबाक, दूसरे प्रश्नों में एक बार "प्रश्न" लिंक पर क्लिक करें – Harmen

+0

@ एएलएफ: जब मैंने यह प्रश्न देखा तो यह अनुत्तरित नहीं था और इसलिए मैंने इसका उत्तर दिया। चाल है: 10 सेकंड में कम से कम एक बार "नए प्रश्न" पृष्ठ को ताज़ा करें। ';-)' –

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