Antworten:
Aus der Java-Sprachspezifikation - 15.26.2 Compound Assignment Operators .
Eine Verbindung Zuweisungsausdruck von der Form
E1 op= E2entsprichtE1 = (T)((E1) op (E2)), in demTdie Art derE1Ausnahme , dassE1nur 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 bmuss es sein booleanund 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 bes sich um eine Variable oder eine Konstante handelt, ist das Ergebnis für beide Versionen gleich. Es gibt nur einen semantischen Unterschied, wenn bein 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 bund den Kosten für einen Test und eine Verzweigung des Werts von aund der potenziellen Einsparung, eine unnötige Zuordnung zu zu vermeiden a. Die Analyse ist nicht einfach, aber wenn die Kosten für die Berechnung bnicht 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 bes sich um ein Primitiv a = a && bhandelt a = a & b, und a &= balle 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 &= bist 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().