短い答え
すべての演算子は+=
、-=
、*=
、 /=
、&=
、|=
...算術演算であり、同じ期待を提供します。
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
長い答え
の例 &&=
場合は&&=
、オペレータが利用可能であった、このコード:
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
。
- 開発者がreturnの
f2()
ときだけ呼び出されるようにしたい場合f1()
はtrue
、上記の2番目のコードの方がエラーが発生しにくくなります。
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
======================
結論
したがってYES我々は交換することができます&&
によって&
のためのbool
値;-)
だから、より良い使用&=
するのではなく&&=
。ブール値には役に立たない
と考えることができ&&=
ます。
同じ ||=
オペレータは|=
また、小さいエラーを起こしやすいより||=
開発者がreturnの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)
または、すべてを1つのラインスタイルで使用する場合:
// 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();