回答:
Java言語仕様から- 15.26.2複合代入演算子。
フォームの化合物代入式は、
E1 op= E2
と等価であるE1 = (T)((E1) op (E2))
場合、T
のタイプがあるE1
ことを除いて、E1
一度だけ評価されます。
したがって、a &= b;
と同等a = a & b;
です。
(一部の使用法では、型キャストは結果に違いをもたらしますが、これb
はそうでなければならboolean
ず、型キャストは何もしません。)
そして、記録のために、a &&= b;
有効なJava ではありません。&&=
オペレーターはいません。
実際には、間にはほとんど意味的な違いがあるa = a & b;
とa = a && b;
。(b
が変数または定数の場合、結果は両方のバージョンで同じになります。b
副作用がある部分式の場合、意味上の違いのみがあります。この&
場合、副作用は常に発生します。&&
の値に応じて発生する場合a
。)
パフォーマンスの面では、の評価b
コストと、の値のテストと分岐のコストa
、およびへの不要な割り当てを回避することによる潜在的な節約との間のトレードオフですa
。分析は簡単ではありませんが、計算のコストがb
重要でない限り、2つのバージョン間のパフォーマンスの差は小さすぎて検討に値しません。
JLSの15.22.2を参照してください。ブールオペランドの場合、&
演算子はビット単位ではなくブール値です。ブールオペランド&&
との唯一の違いは、それが短絡さ&
れ&&
ていることです(つまり、最初のオペランドがfalseと評価された場合、2番目のオペランドは評価されません)。
だから、あなたのケースでは、場合b
原始的である、a = a && b
、a = a & b
、およびa &= b
すべてが同じことを行います。
それが最後です。
a = a & b;
これをテストする簡単な方法は次のとおりです。
public class OperatorTest {
public static void main(String[] args) {
boolean a = false;
a &= b();
}
private static boolean b() {
System.out.println("b() was called");
return true;
}
}
出力はb() was called
なので、右側のオペランドが評価されます。
したがって、他の人がすでに述べたように、はと a &= b
同じa = a & b
です。
aが既にfalseの場合にb()を呼び出さないようにするブール値を使用して、同様の状況に遭遇しました。
これは私のために働きました:
a &= a && b()
a=a&&b()
。