私は c++ が初めてで、コンパイラがブール値の遅延評価を処理する方法に興味があります。例えば、
if(A == 1 || B == 2){...}
A が 1 の場合、B==2 の部分は評価されますか?
私は c++ が初めてで、コンパイラがブール値の遅延評価を処理する方法に興味があります。例えば、
if(A == 1 || B == 2){...}
A が 1 の場合、B==2 の部分は評価されますか?
いいえ、B==2
パーツは評価されません。これを短絡評価と呼びます。
編集:Robert C. Cartainoが正しく指摘している ように、論理演算子がオーバーロードされている場合、短絡評価は行われません(そうは言っても、誰かが論理演算子をオーバーロードする理由は私を超えています)。
||
演算子がオーバーロードされていない限り、 2 番目の式は評価されません。これを「短絡評価」と呼びます。
論理積 (&&) および論理和 (||) の場合、最初の式が式全体の値を決定するのに十分である場合、2 番目の式は評価されません。
上記の場合:
if(A == 1 || B == 2) {...}
...2 番目の式は評価されません。
TRUE || ANYTHING
、常に評価されTRUE
ます。
同じく、
FALSE && ANYTHING
、常に と評価されるFALSE
ため、その条件も短絡評価を引き起こします。
&&
||
B==2 部分は評価されません。
気をつけて! そこに ++B==2 のようなものを置かないでください!
C++ はブール式の評価にショート サーキットB == 2
を適用するため、は評価されず、コンパイラはそれを完全に省略することさえあります。
コンパイラは、中間ジャンプを生成することでこれを処理します。次のコードの場合:
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)
いいえ、ちがいます。
と同じで&&
、一方が間違っていても、もう一方を評価する必要はありません。
B == 2
評価されることはありません。
詳細については、短絡評価を参照してください。