Yanıtlar:
Java Dil Spesifikasyonundan - 15.26.2 Bileşik Atama İşleçleri .
Şeklinde olan bir bileşik atama ifade
E1 op= E2
eşdeğerdirE1 = (T)((E1) op (E2))
, buradaT
türüdürE1
dışında,E1
sadece 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 b
olması gerekir boolean
ve 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;
. ( b
Değişken veya sabitse, sonuç her iki sürüm için de aynı olacaktır. b
Yan 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 b
maliyeti ile testin ve dalın değerinin maliyeti ile a
gereksiz 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, b
bir ilkel a = a && b
ise a = a & b
, ve a &= b
hepsi 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 &= b
gibi, 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()
.