2009-08-25 20 views
16
if((A) && (B)) 
{ 
    //do something 
} 
else 
    //do something else 

सवाल यह है कि अगर कोई गलत था तो बयान तत्काल तोड़ देगा। क्या बी भी मूल्यांकन किया जाएगा?कैसे 'if (A && B)' कथन का मूल्यांकन किया जाता है?

मैं इस मामले में यह पूछता हूं कि बी सरणी इंडेक्स की वैधता की जांच करता है [0] जब सरणी वास्तव में खाली होती है और शून्य तत्व होते हैं। इसलिए एक segfault फेंकना क्योंकि हम सरणी की सीमा से बाहर कुछ ऐसा करने की कोशिश कर रहे हैं। विशेष रूप से

if((array.GetElements() > 0) && (array[0])) 
    array[0]->doSomething(); 
else 
    //do nothing and return 

यह खतरनाक है, तो सरणी [0] वास्तव में मूल्यांकित किया जाता है, क्योंकि यह की '& &' बाईं ओर पहला चेक बिना segfaults हो सकता है। प्राथमिकता मुझे बताती है कि बायीं ओर निश्चित रूप से प्राथमिकता ले ली जाएगी, लेकिन यह मुझे नहीं बताती है कि बाएं गलत होने पर यह सही पक्ष का मूल्यांकन नहीं करेगा।

+0

अन्य कैनोलिक रूप 'if (p && p-> bar) {}' है। यह भी सुरक्षित है। – MSalters

+0

यदि आप सिर्फ "कुछ भी नहीं करना चाहते हैं और वापस लौटना चाहते हैं", तो आपको पूरी तरह से "अन्य" छोड़ना चाहिए। अन्यथा, संकलक या तो शिकायत करेगा कि किसी और के साथ जाने का कोई बयान नहीं है (अगर संलग्न ब्लॉक में आखिरी चीज है) या बदतर, अगला कथन लें और अन्य ब्लॉक में दिए गए बयान के रूप में इसका इस्तेमाल करें । –

+0

मैंने प्लेसहोल्डर के रूप में टिप्पणियों का उपयोग करने का प्रयास किया जिसका अर्थ है: कुछ कोड यहां जायेंगे, लेकिन मेरे उदाहरण में शामिल करना महत्वपूर्ण नहीं है। स्थिति की वास्तविकता यह है कि कोड है जो किसी अन्य के दायरे में लौटाता है लेकिन दूसरे के दायरे के बाद कोड भी देता है। उम्मीद है कि इसे – BuckFilledPlatypus

उत्तर

44

सी और सी ++ में, && और || ऑपरेटर "शॉर्ट-सर्किट"। इसका मतलब है कि यदि आवश्यक हो तो वे केवल पैरामीटर का मूल्यांकन करते हैं। यदि && पर पहला पैरामीटर गलत है, या पहले || सत्य है, तो बाकी का मूल्यांकन नहीं किया जाएगा।

आपके द्वारा पोस्ट किया गया कोड सुरक्षित है, हालांकि मैं सवाल करता हूं कि आप खाली else ब्लॉक क्यों शामिल करेंगे।

+0

साफ़ करता है हां मेरी टिप्पणी गलत थी, // कुछ भी नहीं बदली और वापस लौटा जो इस मामले में अधिक सटीक है। – BuckFilledPlatypus

+10

मैं यह जोड़ना चाहता हूं कि अगर आप ओवरलोड ऑपरेटर && या || अपनी खुद की कक्षा में, वे अब शॉर्ट-सर्किट नहीं करते हैं। मन में कुछ रखने के लिए। –

+2

@ क्रिस्टो, मुझे यह नहीं पता था! हालांकि, मुझे नहीं लगता कि उस ऑपरेटर को अधिभारित करने के लिए कोई सौहार्दपूर्ण मामला है। मुझे लगता है कि बूल कास्ट ऑपरेटर ओवरलोडिंग अधिक उपयोगी होगा। – strager

-4

हाँ, अगर ((ए) & & (बी)) पहले खंड पर विफल हो जाएगा, अगर (ए) झूठे मूल्यांकन करता है।

यह किसी भी भाषा बीटीडब्ल्यू पर लागू होता है, न केवल सी डेरिवेटिव्स। थ्रेडेड और समांतर प्रसंस्करण के लिए यह एक अलग कहानी है;)

+6

हर भाषा नहीं। विजुअल बेसिक जैसे कुछ भाषाओं में लॉजिकल ऑपरेटर हैं जो * शॉर्ट सर्किट नहीं करते हैं। –

+1

मैं यह इंगित करना चाहता हूं कि "OrElse" और "AndAlso" पेश करने से पहले यह लंबे समय तक वीबी के साथ मामला नहीं रहा है। अब भी, "या" और "और" शॉर्ट सर्किट नहीं है। इसका कारण यह है कि पहले तार्किक और bitwise "या" और "और" ऑपरेटर समान थे। – DevByDefault

+1

कुछ भाषाओं जैसे कि एडा, दोनों विकल्प उपलब्ध हैं ("और"/"और फिर" और "OR"/"या ELSE")। –

10

आप && ऑपरेटर के बारे में पूछ रहे हैं, if कथन नहीं।

&&short-circuits, जिसका अर्थ है कि यदि काम करते समय यह एक शर्त को पूरा करता है जिसके परिणामस्वरूप केवल एक ही जवाब होता है, तो यह काम करना बंद कर देगा और उस उत्तर का उपयोग करेगा।

तो, 0 && x0 निष्पादित करेंगे, तो समाप्त अभिव्यक्ति क्या && को दूसरा पैरामीटर है की परवाह किए बिना गैर शून्य का मूल्यांकन करने के लिए कोई रास्ता नहीं है क्योंकि वहाँ।

3

हां, इसे Short-circuit Evaluation कहा जाता है।

यदि बयान के विवरण के बाद बुलियन कथन की वैधता आश्वस्त की जा सकती है, तो बाकी का मूल्यांकन नहीं किया जाता है।

यह बहुत महत्वपूर्ण है जब कुछ बयानों के दुष्प्रभाव होते हैं।

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