Antworten:
Aus der Java-Sprachspezifikation - 15.26.2 Compound Assignment Operators .
Eine Verbindung Zuweisungsausdruck von der Form
E1 op= E2
entsprichtE1 = (T)((E1) op (E2))
, in demT
die Art derE1
Ausnahme , dassE1
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 Primitiv a = a && b
handelt a = a & b
, und a &= b
alle das Gleiche tun.
Es ist der 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 called
, daher wird der rechte Operand ausgewertet.
Also, wie bereits von anderen erwähnt, a &= b
ist das gleiche wie a = a & b
.
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:
a &= a && b()
a=a&&b()
.