C++でこのようなコードを記述する場合:
_bool allTrue = true;
allTrue = allTrue && check_foo();
allTrue = allTrue && check_bar();
_
check_bar()
がfalse
を返した場合、check_foo()
は評価されません。これは 短絡または短絡評価 と呼ばれ、遅延評価の原則の一部です。
これは、複合代入演算子_&=
_で機能しますか?
_bool allTrue = true;
allTrue &= check_foo();
allTrue &= check_bar(); //what now?
_
論理OR
の場合、すべての_&
_を_|
_に、true
をfalse
に置き換えます。
C++ 11 5.17 Assignment and compound assignment operators
から:
E1 op = E2という形式の式の動作は、E1が1回だけ評価されることを除いて、E1 = E1 op E2と同等です。
ただし、does short-circuitの論理ANDと、決して行わないbitwise ANDを混在させています。
テキストスニペット&&=
は、あなたが求めていることをどのように行うかを示していますが、標準ではnowhereです。その理由は、実際には存在しないからです。論理演算子と代入演算子はありません。
短絡(レイジー)評価は、論理&&
および||
。ビット単位&
および|
は両方の引数を評価します。
いいえ、短縮されません。
&=
および|=
演算子は、&
+ =
および|
+ =
として形成されることに注意してください。 ビット演算子&
および|
は、ショートカット評価を実行しません。
ブール演算子&&
および||
のみが実行します。
つまり、ショートカット演算子には、従来から&&=
および||=
という名前を付ける必要があります。一部の言語はそれらを提供します。 C/C++はサポートしていません。
コードallTrue &= check_foo();
は、allTrue = allTrue & check_foo()
と同等です。使用しているbitwise AND
および遅延評価は実行されません。
bitwise AND
は、バイナリ表現が同じ長さの2つの引数をとる必要があり、useslogical AND
ビットの対応する各ペアを比較する操作。
最初:a &= b;
はa = a && b;
と同じではありません。 a &= b;
はa = a & b;
を意味します。 C/C++では、a &&= b;
はありません。
論理AND a && b
は、1ビットのテストに少し似ています。最初の「ビット」がすでに0の場合、2番目に関係なく結果は常に0になります。そのため、b
から結果がすでに明らかな場合は、a
を評価する必要はありません。 C/C++標準では、この最適化が許可されています。
ビット単位AND a & b
は、a
およびb
のすべてのビットに対してこのテストを実行します。したがって、b
の少なくとも1ビットがゼロ以外の場合、a
を評価する必要があります。 a==0
の場合、b
よりも評価されないことを望むかもしれませんが、C/C++ではこの最適化は許可されません。
&はビット演算であるため、check_foo()は、allTrueの値に関係なく、最初に評価されます
allTrue &= check_foo(); // also for allTrue = allTrue & check_foo();
そしてまた
allTrue &= check_bar(); // also for allTrue = allTrue & check_bar();
ただし、&&を使用してalltrueがfalseの場合、check_foo()は呼び出されません。
allTrue = allTrue && check_foo();