Java の &= 演算子は & と && のどちらに適用されますか? 質問する

Java の &= 演算子は & と && のどちらに適用されますか? 質問する

仮定すると

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が、 はE11 回だけ評価されます。

したがって、 はa &= b;と同等ですa = a & b;

(使用法によっては、型キャストによって結果が変わりますが、この場合は必ず型キャストbが必要でありboolean、型キャストは何も行いません。)

ちなみに、これa &&= b;は有効な Java ではありません。演算子はありません&&=


実際には、a = a & b;との間には意味上の違いはほとんどありませんa = a && b;。(bが変数または定数の場合、結果は両方のバージョンで同じになります。 がb副作用を持つ部分式である場合にのみ意味上の違いがあります。 の&場合、副作用は常に発生します。 の場合、&&の値に応じて副作用が発生しますa。)

パフォーマンス面では、 を評価するコストbと、 の値のテストと分岐のコストa、および への不要な割り当てを回避することで節約できる可能性のあるコストの間でトレードオフが発生しますa。分析は単純ではありませんが、計算コストがb重要でない限り、2 つのバージョン間のパフォーマンスの違いは考慮する価値がないほど小さいです。

おすすめ記事