Java & = operatörü & veya && kullanıyor mu?


139

varsayarsak

boolean a = false;

Merak ediyordum:

a &= b; 

eşittir

a = a && b; //logical AND, a is false hence b is not evaluated.

ya da diğer taraftan

a = a & b; //Bitwise AND. Both a and b are evaluated.

Yanıtlar:


146

Java Dil Spesifikasyonundan - 15.26.2 Bileşik Atama İşleçleri .

Şeklinde olan bir bileşik atama ifade E1 op= E2eşdeğerdir E1 = (T)((E1) op (E2)), burada Ttürüdür E1dışı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.


"Pratikte" paragrafınız yanıltıcıdır. & & & &
Kullanmanın

Aydınlatılmış. (Aslında, önemsizlik gerçekten içine girmez.)
Stephen C

51

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.


2
Eğer b bir yöntem çağrısı ise (a & = b;) kısa devre yapmaz? "&& =" operatörü gibi bir şey var mı?
is7s

2
Bu soruya cevap vermiyor gibi görünüyor; OP zaten kısa devreyi biliyordu.
VEYA Haritacı


0

İş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.


-2

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()

25
Fazlalıklardan kaçınmak için (yine de kısa devreye izin verir), sadece yazabilirsiniz a=a&&b().
Unai Vivi
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.