Wendet der Java-Operator &= & oder && an?

Lesezeit: 3 Minuten

Benutzer-Avatar
pakore

Vorausgesetzt

boolean a = false;

Ich habe mich gefragt, ob ich Folgendes tue:

a &= b; 

ist äquivalent zu

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

oder andererseits bedeutet es

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

Benutzer-Avatar
Stefan C

Aus der Java-Sprachspezifikation – 15.26.2 Zusammengesetzte Zuweisungsoperatoren.

Ein zusammengesetzter Zuweisungsausdruck des Formulars E1 op= E2 ist äquivalent zu E1 = (T)((E1) op (E2))wo T ist die Art von E1außer dass E1 wird nur einmal ausgewertet.

So a &= b; ist äquivalent zu a = a & b;.

(In einigen Verwendungen macht die Typumwandlung einen Unterschied im Ergebnis, aber in dieser b muß sein boolean und die Typumwandlung tut nichts.)

Und fürs Protokoll, a &&= b; ist kein gültiges Java. Es gibt kein &&= Operator.


In der Praxis gibt es kaum einen semantischen Unterschied zwischen a = a & b; und a = a && b;. (Wenn b eine Variable oder eine Konstante ist, wird das Ergebnis für beide Versionen gleich sein. Es gibt nur einen semantischen Unterschied wann b ist ein Unterausdruck, der Nebeneffekte hat. In dem & Fall tritt die Nebenwirkung immer auf. In dem && Fall tritt es je nach Wert auf a.)

Auf der Leistungsseite besteht der Kompromiss zwischen den Bewertungskosten bund die Kosten für einen Test und Zweig des Wertes von aund die potenzielle Einsparung durch Vermeidung einer unnötigen Zuordnung zu a. Die Analyse ist nicht einfach, aber es sei denn, die Kosten für die Berechnung b nicht trivial ist, ist der Leistungsunterschied zwischen den beiden Versionen zu gering, um eine Überlegung wert zu sein.

  • Hallelujah für die Performance-Kommentare. Ich treffe regelmäßig auf Code-Reviewer, die wollen, dass ich etwas schreibe x = y && x Anstatt von x = y & zfür einfache boolesche Variablen.

    – Zugriffsverletzung

    21. August um 14:25 Uhr


Benutzer-Avatar
Eintopf

sehen 15.22.2 des JLS. Für boolesche Operanden ist die & Operator ist boolesch, nicht bitweise. Der einzige Unterschied zw && und & für boolesche Operanden ist das für && es ist kurzgeschlossen (was bedeutet, dass der zweite Operand nicht ausgewertet wird, wenn der erste Operand als falsch ausgewertet wird).

Also in Ihrem Fall, wenn b ist ein Primitiv, a = a && b, a = a & bund a &= b alle machen das gleiche.

  • (a &= b;) wird also nicht kurzschließen, wenn b ein Methodenaufruf ist? Gibt es so etwas wie einen “&&=”-Operator?

    – is7s

    25. April 2012 um 18:34 Uhr

  • Es scheint, dass dies die Frage nicht beantwortet; Das OP wusste bereits über Kurzschlüsse Bescheid.

    – OR-Mapper

    15. November 2012 um 7:58 Uhr

Es ist das letzte:

a = a & b;

Hier ist eine einfache Möglichkeit, es zu testen:

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;
    }
}

Die Ausgabe ist b() was calleddaher wird der rechte Operand ausgewertet.

Also, wie schon von anderen erwähnt, a &= b ist das gleiche wie a = a & b.

Benutzer-Avatar
Daniel Testa

Ich bin auf eine ähnliche Situation mit booleschen Werten gestoßen, in der ich vermeiden wollte, b() aufzurufen, wenn a bereits falsch war.

Das hat bei mir funktioniert:

a &= a && b()

  • Um Redundanzen zu vermeiden (wobei noch Kurzschlüsse möglich sind), können Sie einfach schreiben a=a&&b().

    – Unai Vivi

    8. September 2012 um 9:39 Uhr

  • Um Redundanzen zu vermeiden (wobei noch Kurzschlüsse möglich sind), können Sie einfach schreiben a=a&&b().

    – Unai Vivi

    8. September 2012 um 9:39 Uhr

1344710cookie-checkWendet der Java-Operator &= & oder && an?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy