コードスニペットを想定
bool a;
a = true;
a |= mayRun();
a = false;
a |= mayRun();
mayRun() が実行されているのはどの場合ですか?
すべての説明が教えてくれます
a |= b;
。
a = a | b;
ただし、例が示すように同じにすることはできません
arr[i++] |= b;
。
コードスニペットを想定
bool a;
a = true;
a |= mayRun();
a = false;
a |= mayRun();
mayRun() が実行されているのはどの場合ですか?
すべての説明が教えてくれます
a |= b;
。
a = a | b;
ただし、例が示すように同じにすることはできません
arr[i++] |= b;
。
&&
ショートサーキットはビット単位の演算には適用されない (やなどの論理演算にのみ適用される) ため、常に実行され||
ます。
この誤解は厄介なエラーにつながる可能性があることに注意してください。開発者は短絡があると想定しますが、短絡はなく、すべての式部分が常に実行され、プログラム ロジックが変更されます。
常に実行されます。これa |= b
は実際にはa = a | b
(1 回のみ評価a
) の省略形であることに注意してください。特に、これはの省略形ではありませんa = a || b
。
これは、ブール演算子の短絡動作を提供しないことを意味するため、b
は常に評価されます。
bool
セマトニクスが非自明であるため、変数でこれらの簡略代入形式を使用することは危険です。&=
実際にはさらに悪いです。これを比較してください:
int two() { return 2; }
int main()
{
bool b = true;
b = b && two();
assert(b); //OK
}
これとともに:
int two() { return 2; }
int main()
{
bool b = true;
b &= two();
assert(b); //FAILS!!
// b &= two(); was actually b = 1 & 2, which is 0 !
}
つまり、ブール変数|=
で andを使用することは避けてください。&=
どの場合
mayRun()
に実行されていますか?
常に実行されます。
|=
おそらく、短絡を実行することを期待していましたが、そうではありません。これは、結果が最初のオペランドだけから決定できる場合にのみ、論理演算子&&
andで発生します。||
のような論理複合代入演算子はない||=
ため、代入式でショートサーキットが発生することはありません。
すべての説明が教えてくれます
a |= b;
。a = a | b;
ほとんど; しかし、あなたがこれまで読んできた説明は、重要な詳細を見逃しています。
ただし、例が示すように同じにすることはできません
arr[i++] |= b;
。
実際、C++11 5.17/7 で指定されているように、違いがあります。
E1 が 1 回だけ評価されることを除いて、フォームの式の動作
E1 op = E2
は と同じです。E1 = E1 op E2