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
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.
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
13447100cookie-checkWendet der Java-Operator &= & oder && an?yes