質問: false; cout << "is_true : " << is_true << endl; cout << "is_false : " << is_false << endl; cout << endl; // bool値の演算は、論理演算ではなくbit演算子でも良いのだろうか? // C++的に boot値は 0/1 で内部的には持ってそうなので行けそう? // ビット演算子だと代入が簡単なので使いたいなーというお話 // is_true true cout << "is_true && true : " << (is_true && true) << endl; cout << "is_true & true : " << (is_true & true) << endl; // これが使える is_true &= true cout << "is_true || true : " << (is_true || true) << endl; cout << "is_true | true : " << (is_true | true) << endl; // これが使える is_true |= true cout << endl; // is_false true cout << "is_false && true : " << (is_false && true) << endl; cout << "is_false & true : " << (is_false & true) << endl; // これが使える is_false &= true cout << "is_false || true : " << (is_false || true) << endl; cout << "is_false | true : " << (is_false | true) << endl; // これが使える is_false |= true cout << endl; // is_true false cout << "is_true && false : " << (is_true && false) << endl; cout << "is_true & false : " << (is_true & false) << endl; // これが使える is_true &= false cout << "is_true || false : " << (is_true || false) << endl; cout << "is_true | false : " << (is_true | false) << endl; // これが使える is_true |= false cout << endl; // is_false false cout << "is_false && false : " << (is_false && false) << endl; cout << "is_false & false : " << (is_false & false) << endl; // これが使える is_false &= false cout << "is_false || false : " << (is_false || false) << endl; cout << "is_false | false : " << (is_false | false) << endl; // これが使える is_false |= false return 0; } ``` ``` is_true : 1 is_false : 0 is_true && true : 1 is_true & true : 1 is_true || true : 1 is_true | true : 1 is_false && true : 0 is_false & true : 0 is_false || true : 1 is_false | true : 1 is_true && false : 0 is_true & false : 0 is_true || false : 1 is_true | false : 1 is_false && false : 0 is_false & false : 0 is_false || false : 0 is_false | false : 0 ```
回答: x、y がbool型の変数とします。もし、これらが局所変数でうっかり初期化を忘れてしまった場合などでは、値がtrueでもfalseでもないゴミである可能性があります。その場合、x && y と x & y は同じとは限りません。 もうひとつ、f(z)がbool型の副作用のある式だとします。この場合、 x = x && f(z); はxがfalseの場合、f(z)は評価されませんので副作用はありません。しかし、 x &= f(z); の場合は、xの値が何であってもf(z)は評価されますので必ず副作用があることになります。 そのため、論理演算子をビット演算子に置き換えた場合に挙動が異なる可能性があります。