Also für binäre Operatoren auf booleans, Java hat &
, |
, ^
, &&
und ||
.
Fassen wir hier kurz zusammen, was sie tun:
- JLS 15.22.2 Boolesche logische Operatoren &, ^ und |
- JLS 15.23 Bedingter und Betreiber &&
- JLS 15.24 Bedingter oder Operator ||
Für
&
ist der Ergebniswert ,true
wenn beide Operanden - Werte sindtrue
; Andernfalls ist das Ergebnisfalse
.Für
|
ist der Ergebniswert ,false
wenn beide Operanden - Werte sindfalse
; Andernfalls ist das Ergebnistrue
.Für
^
ist der Ergebniswert ,true
wenn die Operandenwerte unterschiedlich sind; Andernfalls ist das Ergebnisfalse
.Der
&&
Operator ist wie&
, bewertet aber seinen rechten Operanden nur, wenn der Wert seines linken Operanden isttrue
.Der
||
Operator ist wie|
, bewertet seinen rechten Operanden jedoch nur, wenn der Wert seines linken Operanden gleich istfalse
.
Nun, unter allen 5, 3 davon haben Verbindung Zuordnung Versionen, nämlich |=
, &=
und ^=
. Meine Frage ist also offensichtlich: Warum bietet Java nicht &&=
und ||=
auch nicht? Ich finde, dass ich die mehr brauche als ich brauche &=
und |=
.
Und ich denke nicht, dass "weil es zu lang ist" eine gute Antwort ist, weil Java hat >>>=
. Es muss einen besseren Grund für diese Unterlassung geben.
Ab 15.26 Zuweisungsoperatoren :
Es gibt 12 Zuweisungsoperatoren. [...]
= *= /= %= += -= <<= >>= >>>= &= ^= |=
Es wurde die Bemerkung gemacht, dass wenn &&=
und ||=
implementiert würden, dies die einzigen Operatoren wären, die die rechte Seite nicht zuerst bewerten. Ich glaube, diese Vorstellung, dass ein zusammengesetzter Zuweisungsoperator zuerst die rechte Seite bewertet, ist ein Fehler.
Ab 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.
Als Beweis wirft das folgende Snippet ein NullPointerException
, kein ArrayIndexOutOfBoundsException
.
int[] a = null;
int[] b = {};
a[0] += b[-1];