Aus der Java-Sprachspezifikation - 15.26.2 Compound Assignment Operators .
Eine Verbindung Zuweisungsausdruck von der Form E1 op= E2
entspricht E1 = (T)((E1) op (E2))
, in dem T
die Art der E1
Ausnahme , dass E1
nur einmal ausgewertet wird.
Ist a &= b;
also gleichbedeutend mit a = a & b;
.
(In einigen Verwendungen macht das Typ-Casting einen Unterschied zum Ergebnis, aber in diesem b
muss es sein boolean
und der Typ-Cast tut nichts.)
Und für den Datensatz a &&= b;
ist Java nicht gültig. Es gibt keinen &&=
Operator.
In der Praxis gibt es kaum einen semantischen Unterschied zwischen a = a & b;
und a = a && b;
. (Wenn b
es sich um eine Variable oder eine Konstante handelt, ist das Ergebnis für beide Versionen gleich. Es gibt nur einen semantischen Unterschied, wenn b
ein Unterausdruck Nebenwirkungen hat. In diesem &
Fall tritt die Nebenwirkung immer auf &&
Fall tritt es in Abhängigkeit vom Wert von a
.)
Auf der Leistungsseite liegt der Kompromiss zwischen den Kosten für die Bewertung b
und den Kosten für einen Test und eine Verzweigung des Werts von a
und der potenziellen Einsparung, eine unnötige Zuordnung zu zu vermeiden a
. Die Analyse ist nicht einfach, aber wenn die Kosten für die Berechnung b
nicht trivial sind, ist der Leistungsunterschied zwischen den beiden Versionen zu gering, um in Betracht gezogen zu werden.
siehe 15.22.2 des JLS . Bei booleschen Operanden ist der
&
Operator boolesch und nicht bitweise. Der einzige Unterschied zwischen&&
und&
für boolesche Operanden ist der für&&
sie kurzgeschlossen sind (was bedeutet, dass der zweite Operand nicht ausgewertet wird, wenn der erste Operand als falsch ausgewertet wird).Also in Ihrem Fall, wenn
b
es sich um ein Primitiva = a && b
handelta = a & b
, unda &= b
alle das Gleiche tun.quelle
Es ist der letzte:
quelle
Hier ist eine einfache Möglichkeit, es zu testen:
Die Ausgabe ist
b() was called
, daher wird der rechte Operand ausgewertet.Also, wie bereits von anderen erwähnt,
a &= b
ist das gleiche wiea = a & b
.quelle
Ich bin auf eine ähnliche Situation mit Booleschen Werten gestoßen, bei der ich vermeiden wollte, b () aufzurufen, wenn a bereits falsch war.
Das hat bei mir funktioniert:
quelle
a=a&&b()
.