संक्षिप्त जवाब
सभी ऑपरेटरों +=
, -=
, *=
, /=
, &=
, |=
... गणित कर रहे हैं और एक ही उम्मीद प्रदान करते हैं:
x &= foo() // We expect foo() be called whatever the value of x
हालांकि, ऑपरेटरों &&=
और ||=
तार्किक होगा, और इन ऑपरेटरों त्रुटि प्रवण क्योंकि कई डेवलपर्स उम्मीद करेंगे हो सकता है foo()
हमेशा में कहा जा x &&= foo()
।
bool x;
// ...
x &&= foo(); // Many developers might be confused
x = x && foo(); // Still confusing but correct
x = x ? foo() : x; // Understandable
x = x ? foo() : false; // Understandable
if (x) x = foo(); // Obvious
क्या वास्तव में हमें शॉर्टकट पाने के लिए C / C ++ को और अधिक जटिल बनाने की आवश्यकता है x = x && foo()
?
क्या हम वास्तव में अधिक गूढ़ कथन को बाधित करना चाहते हैं x = x && foo()
?
या हम सार्थक कोड लिखना चाहते हैं if (x) x = foo();
?
लंबा जवाब
के लिए उदाहरण &&=
यदि &&=
ऑपरेटर उपलब्ध था, तो यह कोड:
bool ok = true; //becomes false when at least a function returns false
ok &&= f1();
ok &&= f2(); //we may expect f2() is called whatever the f1() returned value
के बराबर है:
bool ok = true;
if (ok) ok = f1();
if (ok) ok = f2(); //f2() is called only when f1() returns true
यह पहला कोड त्रुटि-प्रवण है क्योंकि कई डेवलपर्स को लगता f2()
है कि हमेशा जो भी f1()
लौटाया गया है उसे मूल्य कहा जाएगा । यह लिखने की तरह है bool ok = f1() && f2();
जहां रिटर्न मिलने पर f2()
ही कॉल किया जाता f1()
है true
।
- यदि डेवलपर वास्तव में
f2()
केवल f1()
रिटर्न देने के लिए बुलाया जाना चाहता है true
, इसलिए ऊपर दूसरा कोड कम त्रुटि वाला है।
- Else (डेवलपर
f2()
हमेशा कहा जाना चाहता है), &=
पर्याप्त है:
के लिए उदाहरण &=
bool ok = true;
ok &= f1();
ok &= f2(); //f2() always called whatever the f1() returned value
इसके अलावा, संकलक के लिए यह आसान है कि वह नीचे दिए गए कोड की तुलना में इस कोड को अनुकूलित करे:
bool ok = true;
if (!f1()) ok = false;
if (!f2()) ok = false; //f2() always called
तुलना &&
और&
हम सोच रहे होंगे कि क्या ऑपरेटरों &&
और &
जब पर लागू ही परिणाम देने के bool
मूल्यों?
आइए निम्नलिखित C ++ कोड का उपयोग करके देखें:
#include <iostream>
void test (int testnumber, bool a, bool b)
{
std::cout << testnumber <<") a="<< a <<" and b="<< b <<"\n"
"a && b = "<< (a && b) <<"\n"
"a & b = "<< (a & b) <<"\n"
"======================" "\n";
}
int main ()
{
test (1, true, true);
test (2, true, false);
test (3, false, false);
test (4, false, true);
}
आउटपुट:
1) a=1 and b=1
a && b = 1
a & b = 1
======================
2) a=1 and b=0
a && b = 0
a & b = 0
======================
3) a=0 and b=0
a && b = 0
a & b = 0
======================
4) a=0 and b=1
a && b = 0
a & b = 0
======================
निष्कर्ष
इसलिए हाँ हम बदल सकते हैं &&
द्वारा &
लिए bool
मान ;-)
तो बेहतर उपयोग करने &=
के बजाय &&=
।
हम &&=
बूलियन के लिए बेकार के रूप में विचार कर सकते हैं ।
उसी के लिए ||=
ऑपरेटर |=
की तुलना में त्रुटि-प्रवण भी कम है||=
यदि कोई डेवलपर चाहता f2()
है कि केवल f1()
रिटर्न दिया जाए false
, इसके बजाय:
bool ok = false;
ok ||= f1();
ok ||= f2(); //f2() is called only when f1() returns false
ok ||= f3(); //f3() is called only when f1() or f2() return false
ok ||= f4(); //f4() is called only when ...
मैं निम्नलिखित और अधिक समझने योग्य विकल्प की सलाह देता हूं:
bool ok = false;
if (!ok) ok = f1();
if (!ok) ok = f2();
if (!ok) ok = f3();
if (!ok) ok = f4();
// no comment required here (code is enough understandable)
या यदि आप एक पंक्ति शैली में सभी पसंद करते हैं:
// this comment is required to explain to developers that
// f2() is called only when f1() returns false, and so on...
bool ok = f1() || f2() || f3() || f4();