仮定すると
boolean a = false;
次のことを実行したいと思いました:
a &= b;
は以下と同等である
a = a && b; //logical AND, a is false hence b is not evaluated.
あるいは逆に言えば
a = a & b; //Bitwise AND. Both a and b are evaluated.
ベストアンサー1
Java言語仕様より -15.26.2 複合代入演算子。
形式の複合代入式
E1 op= E2
は と同等ですE1 = (T)((E1) op (E2))
。ここで はT
の型ですE1
が、 はE1
1 回だけ評価されます。
したがって、 はa &= b;
と同等ですa = a & b;
。
(使用法によっては、型キャストによって結果が変わりますが、この場合は必ず型キャストb
が必要でありboolean
、型キャストは何も行いません。)
ちなみに、これa &&= b;
は有効な Java ではありません。演算子はありません&&=
。
実際には、a = a & b;
との間には意味上の違いはほとんどありませんa = a && b;
。(b
が変数または定数の場合、結果は両方のバージョンで同じになります。 がb
副作用を持つ部分式である場合にのみ意味上の違いがあります。 の&
場合、副作用は常に発生します。 の場合、&&
の値に応じて副作用が発生しますa
。)
パフォーマンス面では、 を評価するコストb
と、 の値のテストと分岐のコストa
、および への不要な割り当てを回避することで節約できる可能性のあるコストの間でトレードオフが発生しますa
。分析は単純ではありませんが、計算コストがb
重要でない限り、2 つのバージョン間のパフォーマンスの違いは考慮する価値がないほど小さいです。