Asumsi
boolean a = false;
Saya bertanya-tanya apakah melakukan:
a &= b;
setara dengan
a = a && b; //logical AND, a is false hence b is not evaluated.
atau di sisi lain artinya
a = a & b; //Bitwise AND. Both a and b are evaluated.
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
, dana &= b
semua melakukan hal yang sama.sumber
Yang terakhir:
sumber
Berikut cara sederhana untuk mengujinya:
Keluarannya
b() was called
, oleh karena itu operan tangan kanan dievaluasi.Jadi, seperti yang sudah disebutkan oleh orang lain,
a &= b
sama dengana = a & b
.sumber
saya menemukan situasi yang sama menggunakan boolean di mana saya ingin menghindari memanggil b () jika sudah salah.
Ini bekerja untuk saya:
sumber
a=a&&b()
.