1

コードスニペットを想定

bool a;
a = true;
a |= mayRun();

a = false;
a |= mayRun();

mayRun() が実行されているのはどの場合ですか?

すべての説明が教えてくれます a |= b;a = a | b;

ただし、例が示すように同じにすることはできません arr[i++] |= b;

4

3 に答える 3

7

&&ショートサーキットはビット単位の演算には適用されない (やなどの論理演算にのみ適用される) ため、常に実行され||ます。

この誤解は厄介なエラーにつながる可能性があることに注意してください。開発者は短絡があると想定しますが、短絡はなく、すべての式部分が常に実行され、プログラム ロジックが変更されます。

于 2013-12-02T11:28:20.917 に答える
5

常に実行されます。これ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を使用することは避けてください。&=

于 2013-12-02T11:32:03.037 に答える
0

どの場合mayRun()に実行されていますか?

常に実行されます。

|=おそらく、短絡を実行することを期待していましたが、そうではありません。これは、結果が最初のオペランドだけから決定できる場合にのみ、論理演算子&&andで発生します。||のような論理複合代入演算子はない||=ため、代入式でショートサーキットが発生することはありません。

すべての説明が教えてくれますa |= b;a = a | b;

ほとんど; しかし、あなたがこれまで読んできた説明は、重要な詳細を見逃しています。

ただし、例が示すように同じにすることはできませんarr[i++] |= b;

実際、C++11 5.17/7 で指定されているように、違いがあります。

E1 が 1 回だけ評価されることを除いて、フォームの式の動作E1 op = E2は と同じです。E1 = E1 op E2

于 2013-12-02T11:44:54.213 に答える