59

C++ で次のようなコードを記述する場合:

bool allTrue = true;
allTrue = allTrue && check_foo();
allTrue = allTrue && check_bar();

check_bar()check_foo()返された場合は評価されませんfalse。これは短絡または短絡評価と呼ばれ、遅延評価の原則の一部です。

これは複合代入演算子で機能します&=か?

bool allTrue = true;
allTrue &= check_foo();
allTrue &= check_bar(); //what now?

論理的には、すべてをおよびにOR置き換えます。&|truefalse

4

6 に答える 6

2

最初:a &= b;と同じではありませんa = a && b;a &= b;を意味しa = a & b;ます。C/C++ には はありませんa &&= b;

論理 ANDa && bは、1 ビットのテストのようなものです。最初の「ビット」がすでに 0 の場合、結果は秒に関係なく常に 0 になります。bしたがって、結果が からすでに明らかであるかどうかを評価する必要はありませんa。C/C++ 標準では、この最適化が許可されています。

ビットごとの ANDは、とa & bのすべてのビットに対してこのテストを実行します。そのため、少なくとも 1 つのビットが非ゼロになるかどうかを評価する必要があります。if , thanが評価されないことを望むかもしれませんが、この最適化は C/C++ では許可されていません。abbaa==0b

于 2014-04-16T10:57:08.117 に答える
0

& はビット操作なので、 allTrue の値に関係なく check_foo() が最初に評価されます

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();
于 2014-04-16T10:57:22.083 に答える