Jawaban:
Dari Spesifikasi Bahasa Jawa - 15.26.2 Operator Penugasan Majemuk .
Ekspresi penugasan majemuk bentuk
E1 op= E2
setara denganE1 = (T)((E1) op (E2))
, di manaT
jenisE1
, kecuali yangE1
dievaluasi hanya sekali.
Jadi a &= b;
setara dengan a = a & b;
.
(Dalam beberapa penggunaan, tipe-casting membuat perbedaan pada hasilnya, tetapi dalam tipe ini b
harus boolean
dan tipe-cast tidak melakukan apa-apa.)
Dan, sebagai catatan, a &&= b;
Java tidak valid. Tidak ada &&=
operator.
Dalam praktiknya, ada sedikit perbedaan semantik antara a = a & b;
dan a = a && b;
. (Jika b
variabel atau konstanta, hasilnya akan sama untuk kedua versi. Hanya ada perbedaan semantik ketika b
subekspresi yang memiliki efek samping. Dalam &
kasus ini, efek samping selalu terjadi. Dalam &&
hal itu terjadi tergantung pada nilaia
.)
Di sisi kinerja, trade-off adalah antara biaya evaluasi b
, dan biaya tes dan cabang dari nilai a
, dan potensi penghematan dari menghindari penugasan yang tidak perlu a
. Analisisnya tidak langsung, tetapi kecuali biaya penghitungannya b
tidak sepele, perbedaan kinerja antara kedua versi terlalu kecil untuk dipertimbangkan.
lihat 15.22.2 JLS . Untuk operan boolean, &
operator adalah boolean, bukan bitwise. Satu-satunya perbedaan antara &&
dan &
untuk operan boolean adalah untuk&&
pendek (artinya operan kedua tidak dievaluasi jika operan pertama bernilai false).
Jadi dalam kasus Anda, jika b
adalah primitif, a = a && b
, a = a & b
, dan a &= b
semua melakukan hal yang sama.
Yang terakhir:
a = a & b;
Berikut cara sederhana untuk mengujinya:
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;
}
}
Keluarannya b() was called
, oleh karena itu operan tangan kanan dievaluasi.
Jadi, seperti yang sudah disebutkan oleh orang lain, a &= b
sama dengan a = a & b
.
saya menemukan situasi yang sama menggunakan boolean di mana saya ingin menghindari memanggil b () jika sudah salah.
Ini bekerja untuk saya:
a &= a && b()
a=a&&b()
.