Aus der Java Language Specification - 15.26.2 Compound Assignment Operators.
Verbindung Zuweisungsausdruck von der Form E1 op= E2
entspricht E1 = (T)((E1) op (E2))
, wobei die Art der T
E1
ist, mit der Ausnahme, dass E1
nur einmal ausgewertet wird.
So a &= b;
entspricht a = a & b;
.
(In einigen Verwendungen macht das Typ-Casting einen Unterschied zu dem Ergebnis, aber in diesem b
hat boolean
und die Art Guss tut nichts.)
In der Praxis gibt es kleiner 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, wenn die Auswertung von b
Nebenwirkungen haben kann; d.h. wenn es sich um einen nicht-trivialen Unterausdruck handelt.
Auf der Leistungsseite ist der Kompromiss zwischen den Kosten b
auszuwerten, und die Kosten für einen Test und Zweig des Wertes von a
und die mögliche Einsparung von eine unnötige Zuordnung zu a
zu vermeiden. Die Analyse ist nicht einfach, aber wenn die Kosten für die Berechnung b
nicht trivial sind, ist der potenzielle Leistungsunterschied zwischen den beiden Versionen wahrscheinlich zu gering, um eine Überlegung wert zu sein.
So (a &= b;) wird nicht kurzgeschlossen werden, wenn b ein Methodenaufruf ist? Gibt es so etwas wie einen "&& =" Operator? – is7s
korrekt. b() wird aufgerufen. Es gibt keinen && = Operator. – stew
Es scheint, dass dies die Frage nicht beantwortet; Das OP wusste bereits von Kurzschluss. –