Yanıtlar:
Java Dil Spesifikasyonundan - 15.26.2 Bileşik Atama İşleçleri .
Şeklinde olan bir bileşik atama ifade
E1 op= E2eşdeğerdirE1 = (T)((E1) op (E2)), buradaTtürüdürE1dışında,E1sadece bir kere elde edildi.
Yani buna a &= b;eşdeğerdir a = a & b;.
(Bazı kullanımlarda, tür dökümü sonuçta bir fark yaratır, ancak burada bolması gerekir booleanve tür dökümü hiçbir şey yapmaz.)
Ve kayıt için a &&= b;geçerli bir Java değil. &&=Operatör yok .
Uygulamada, a = a & b;ve arasında çok az anlamsal fark vardır a = a && b;. ( bDeğişken veya sabitse, sonuç her iki sürüm için de aynı olacaktır. bYan etkileri olan bir alt ifade olduğunda yalnızca semantik bir fark vardır. Bu &durumda, yan etki her zaman oluşur. &&değerine bağlı olarak ortaya çıkar a.)
Performans tarafında, dengeleme, değerlendirme bmaliyeti ile testin ve dalın değerinin maliyeti ile agereksiz bir atamadan kaçınmanın olası tasarrufu arasındadır a. Analiz basit değildir, ancak hesaplama maliyeti bönemsiz değilse , iki versiyon arasındaki performans farkı dikkate alınmayacak kadar küçüktür.
bkz. JLS'nin 15.22.2'si . Boolean işlenenleri için, &operatör bitsel olarak değil boolean'dır. Boolean işlenenler arasında &&ve &için tek fark &&kısa devre olmasıdır (yani, ilk işlenen yanlış olarak değerlendirilirse ikinci işlenen değerlendirilmez).
Yani sizin durumunuzda, bbir ilkel a = a && bise a = a & b, ve a &= bhepsi aynı şeyi yapar.
Sonuncusu:
a = a & b;
İşte bunu test etmenin basit bir yolu:
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;
}
}
Sonuç olarak b() was called, sağ taraftaki işlenen değerlendirilir.
Yani, başkaları tarafından daha önce de belirtildiği a &= bgibi, aynıdır a = a & b.
Ben zaten yanlış bir b () çağırmak kaçınmak istedim booleans kullanarak benzer bir durumla karşılaştı.
Bu benim için çalıştı:
a &= a && b()
a=a&&b().