web-dev-qa-db-ja.com

bool短絡の&=および| =演算子はありますか?

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の場合、すべての_&_を_|_に、truefalseに置き換えます。

35
iFreilicht

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です。その理由は、実際には存在しないからです。論理演算子と代入演算子はありません。

41
paxdiablo

短絡(レイジー)評価は、論理&&および||。ビット単位&および|は両方の引数を評価します。

11
Wojtek Surowka

いいえ、短縮されません。

&=および|=演算子は、& + =および| + =として形成されることに注意してください。 ビット演算子&および|は、ショートカット評価を実行しません。

ブール演算子&&および||のみが実行します。

つまり、ショートカット演算子には、従来から&&=および||=という名前を付ける必要があります。一部の言語はそれらを提供します。 C/C++はサポートしていません。

8
quetzalcoatl

コードallTrue &= check_foo();は、allTrue = allTrue & check_foo()と同等です。使用しているbitwise ANDおよび遅延評価は実行されません。

bitwise ANDは、バイナリ表現が同じ長さの2つの引数をとる必要があり、useslogical ANDビットの対応する各ペアを比較する操作。

3
user3527357

最初: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++ではこの最適化は許可されません。

1
Danvil

&はビット演算であるため、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();
0