12

私は c++ が初めてで、コンパイラがブール値の遅延評価を処理する方法に興味があります。例えば、

if(A == 1 || B == 2){...}

A が 1 の場合、B==2 の部分は評価されますか?

4

8 に答える 8

22

いいえ、B==2パーツは評価されません。これを短絡評価と呼びます。

編集:Robert C. Cartainoが正しく指摘している ように、論理演算子がオーバーロードされている場合、短絡評価は行われません(そうは言っても、誰かが論理演算子をオーバーロードする理由は私を超えています)。

于 2009-11-25T18:40:20.340 に答える
20

||演算子がオーバーロードされていない限り、 2 番目の式は評価されません。これを「短絡評価」と呼びます。

論理積 (&&) および論理和 (||) の場合、最初の式が式全体の値を決定するのに十分である場合、2 番目の式は評価されません。

上記の場合:

if(A == 1 || B == 2) {...}

...2 番目の式は評価されません。

TRUE || ANYTHING、常に評価されTRUEます。

同じく、

FALSE && ANYTHING、常に と評価されるFALSEため、その条件も短絡評価を引き起こします。

いくつかの簡単なメモ

  • 短絡評価は、過負荷および演算子には適用されません。&&||
  • C++ では、最初の式が最初に評価されることが保証されています。一部の言語では評価の順序が保証されず、VB では短絡評価がまったく行われません。コードを移植するかどうかを知ることは重要です。
于 2009-11-25T18:48:59.727 に答える
1

B==2 部分は評価されません。

気をつけて! そこに ++B==2 のようなものを置かないでください!

于 2009-11-25T18:42:08.270 に答える
1

C++ はブール式の評価にショート サーキットB == 2を適用するため、は評価されず、コンパイラはそれを完全に省略することさえあります。

于 2009-11-25T18:42:32.300 に答える
1

コンパイラは、中間ジャンプを生成することでこれを処理します。次のコードの場合:

if(A == 1 || B == 2){...}

擬似アセンブラにコンパイルされたものは、次のようになります。

    load variable A
    compare to constant 1
    if equal, jump to L1
    load variable B
    compare to constant 2
    if not equal, jump to L2
L1:
    ... (complete body of if statement)
L2:
    (code after if block goes here)
于 2009-11-25T18:42:44.170 に答える
1

ジェームズが言うように、これは短絡評価です。遅延評価はまったく別のものです。

于 2009-11-25T18:44:39.550 に答える
0

いいえ、ちがいます。

と同じで&&、一方が間違っていても、もう一方を評価する必要はありません。

于 2009-11-25T18:40:59.823 に答える
0

B == 2評価されることはありません。

詳細については、短絡評価を参照してください。

于 2009-11-25T18:42:00.023 に答える