2011-09-29 6 views
5

इस कोड का उपयोग करने वाले कुछ कोडों में भाग गया, जिसने मुझे आश्चर्यचकित कर दिया।सी ++: सशर्त बयान के रूप में तार्किक तुलना?

if(condition) foo = bar(); 

condition && (foo = bar()); 

क्या ये दो खंड एक कंपाइलर के बराबर हैं? यदि नहीं, तो वे किस तरह से भिन्न होंगे?

(condition && foo) = bar(); 

इसके अतिरिक्त, && की संभावना अतिभारित किया जा रहा है, जो काफी कुछ भी में हो सकता है है:

+0

ऐसी तकनीक का उपयोग यहां किया जाता है: [सशर्त कथन और टर्नरी ऑपरेटर का उपयोग किये बिना अधिकतम तीन नंबर सी खोजें) (http://stackoverflow.com/questions/7074010/find-maximum-of-three-number-in- सी-बिना-उपयोग-सशर्त-कथन-और-टर्नरी) – Nawaz

+0

नवाज - इस तरह के बेकार होमवर्क असाइनमेंट के लिए ऐसा एक शानदार समाधान। : पी –

उत्तर

1

&& जब तक condition और foo के प्रकार के संयोजन वे समान व्यवहार करना होगा के लिए ओवरलोड हो गया है - बाद इस तरह से काम करेगा:

bool result; 
if(!condition) { 
    result = false; 
} else { 
    foo = bar(); 
    result = foo != 0; 
} 
and result gets ignored 

है कि हमेशा की तरह कम सर्किटिंग - अगर && के पहले घटक है false दूसरे का मूल्यांकन नहीं किया जाता है।

आईएमओ दूसरा संस्करण बहुत कम पठनीय है। & & न हालत है और न ही foo के लिए ओवरलोड न हो जाए

6

ऑपरेटर precendence के कारण, बाद के रूप में व्याख्या की है।

तो संक्षेप में: वे कम से कम सामान्य मामले में बराबर नहीं हैं।

+0

आह, ठीक है आप! हालांकि मेरी गलती थी, मैंने देखा कोड में ब्रांड्स मौजूद हैं। प्रश्न –

1

condition && foolvalue, condition && foo = bar(); का मूल्यांकन बेकार है।

+0

फिक्स्ड फिक्स्ड, मैंने ब्रांड्स को शामिल करने के लिए उपेक्षित किया, इसे सही किया गया है। –

0

एक कंपाइलर त्रुटि है: अवैध एल-मान। समान कार्यक्षमता के लिए आपको

conticion ? foo = bar() : <other accion>; 
+0

नए कोड के साथ, इसका एक ही अर्थ है –

2

पहला संस्करण केवल एक सादा पुराना कथन है।

दूसरा संस्करण एक अभिव्यक्ति है जो संपूर्ण अभिव्यक्ति का परिणाम वापस कर देगा। यह शायद कुछ मुश्किल एक-पंक्ति वाक्यविन्यास की अनुमति देता है, जो सामान्य रूप से, संभावित रूप से कोड को और अधिक पठनीय बना सकता है लेकिन अपरिचितता के कारण जल्दी से इसे अधिक जटिल और कठिन बनाने के लिए कठिन हो जाएगा।

आईएमओ या तो इसे लगातार हर जगह उपयोग करता है ताकि आपके कोड के पाठक इसका उपयोग कर सकें, या इसका उपयोग न करें।

0

हैं:

condition && (foo = bar()); 

रूप

(condition.operator bool()) && (foo = bar()); 

माना जाएगा अगर (condition.operator bool()) सच नहीं है, (foo = बार()) निष्पादित नहीं किया जाएगा और इसके विपरीत।

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