2012-01-26 15 views
7

सी में एक बूलियन ++ मैं C++ निम्नलिखित निर्माण पर ठोकर खाई के लिए:ऑपरेटर | =

bool result = false; 
for(int i = 0; i<n; i++){ 
    result |= TryAndDoSomething(i); 
} 

मैं माना जाता है कि इस |= OR ऑपरेटर के लिए एक शॉर्टकट था, और result अंत अगर में true बराबर होता है कि TryAndDoSomething पर इनमें से कम से कम एक कॉल true लौटा दी गई थी।

लेकिन अब मुझे आश्चर्य है कि एक से अधिक कॉल वास्तव में true लौट सकते हैं।

result = result || TryAndDoSomething(i); 

तो विधि केवल तभी वापसी false के लिए मूल्यांकन बुलाया जाएगा, कि, कोई अन्य कॉल करने से पहले true दिया जाता है, तो: वास्तव में अगर हम आपरेशन के रूप में विस्तार। इस प्रकार एक कॉल के बाद true लौटा, कोई अन्य कॉल नहीं किया जाएगा।

क्या यह सही व्याख्या है?

+1

आप इसे आसानी से परीक्षण कर सकते हैं। मैंने अभी किया, और ऐसा लगता है कि सभी कॉल किए गए हैं, न केवल पहले। –

उत्तर

7

बूलियन पर, ||| के समान परिणाम उत्पन्न करता है, लेकिन शॉर्ट सर्किट नहीं करता है। |= का सही संचालन हमेशा मूल्यांकन किया जाता है।

+0

@MooingDuck: यह प्रश्न केवल बूलियन के बारे में पूछता है। मुझे नहीं पता कि ओपी बिटवाई के बारे में जानता है या, और यह जो भी कर रहा है उसके लिए यह महत्वपूर्ण नहीं दिखता है। –

+0

आईडी उत्तर के साथ खुश रहें यदि आपने कहा कि वे गैर-बूलियन के लिए अलग कैसे थे क्योंकि ओपी स्पष्ट रूप से बिटवाई-या (सही टाइपो) –

13

यह थोड़ा सा या असाइनमेंट है, शॉर्ट-सर्किट या मूल्यांकन नहीं। यह के बराबर है:

result = result | TryAndDoSomething(i); 

नहीं

result = result || TryAndDoSomething(i); 
2

x |= f() (बिटवाइज़ या) और x = x || f() (तार्किक या) के बीच इस संदर्भ में फर्क सिर्फ इतना है कि बाद शॉर्ट सर्किट है। पूर्व में, f() को n बार निष्पादित किया जाएगा-बेशक f() अपवाद फेंकता है, लेकिन यह एक और कहानी है।

|| संस्करण में, f() अब xtrue बनने के बाद नहीं कहा जाएगा। सी ++ में ||= ऑपरेटर नहीं है, लेकिन यह समझना महत्वपूर्ण है कि |= और ||= (यदि यह अस्तित्व में है) इस वजह से अलग-अलग अर्थशास्त्र होगा। |= लापता ||= के लिए सिर्फ एक प्रतिस्थापन नहीं है।

एक तरफ ध्यान दें के रूप में, आप bool उपयोग कर रहे हैं प्रदान की है, बिटवाइज़ आपरेशन मानक निर्दिष्ट करता है, क्योंकि वह true और false पूर्णांकों 1 और 0 क्रमश: में बदलने का, सुरक्षित है। तो इस मामले में एकमात्र अंतर आलसी मूल्यांकन बनाम उत्सुक है।

+0

@MooingDuck: True के बारे में नहीं जानता है। ओपी के संदर्भ तक सीमित करने के लिए संपादित किया गया। –

+0

आपको बस उसे बताना है कि उसकी व्याख्या अमान्य है। | = bitwise है या जैसा कि आप इंगित करते हैं। तो x | = 1 x = x | जैसा ही है 1. एक्स || = 1; संकलन नहीं करेंगे। –

+0

@ रामहाउंड: फिर से प्रश्न पढ़ें। –

0

result |= Try()result = result | Try(); के लिए छोटा है। || ऑपरेटर आपको समझ में आता है, लेकिन | ऑपरेटर काफी अलग है। इसका नाम थोड़ा सा है या (तार्किक या विरोध के विपरीत)। यह वही प्रभाव डालता है जैसे कि यह ऑपरेटरों के प्रत्येक बिट पर a=a||b निष्पादित करता है, और इसमें तार्किक और/या होने वाली त्वरित-बकाया चीज़ नहीं है। (यह भी पागल तेज है; अतिरिक्त से तेज़ या तेज़)। अन्य बिटवाई ऑपरेशंस & (बिटवाई और a=a&&b प्रत्येक बिट पर) हैं, और ^ (बिटवाई xor: a=(a!=b) प्रत्येक बिट पर)।

+0

@BenVoigt: कॉपी-पेस्ट एफटीएल! धन्यवाद! Fix'd। –

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