Więc dla operatorów binarnych logicznych, Java ma &
, |
, ^
, &&
i ||
.
Podsumujmy pokrótce, co robią tutaj:
- JLS 15.22.2 Operatory logiczne Boole'a &, ^ i |
- JLS 15.23 Warunek i operator &&
- JLS 15.24 Operator warunkowy lub ||
Dla
&
wartościtrue
wynikowej jest, jeśli obie wartości operandów sątrue
; w przeciwnym razie wynik tofalse
.Dla
|
wartościfalse
wynikowej jest, jeśli obie wartości operandów sąfalse
; w przeciwnym razie wynik totrue
.Dla
^
wartościtrue
wynikowej jest to, że wartości argumentów są różne; w przeciwnym razie wynik tofalse
.
&&
Operator jest jak&
ale ocenia jego prawy operand tylko wtedy, gdy wartość jego lewostronny operand jesttrue
.
||
Operator jest podobny|
, ale ocenia jego prawy operand tylko wtedy, gdy wartość jego lewostronny operand jestfalse
.
Teraz spośród wszystkich 5, 3 z nich mają złożone wersje zadania, a mianowicie |=
, &=
i ^=
. Więc moje pytanie jest oczywiste: dlaczego Java nie zapewnia &&=
i ||=
również? Uważam, że potrzebuję ich bardziej niż potrzebuję &=
i |=
.
I nie uważam, że „ponieważ jest za długi” to dobra odpowiedź, ponieważ Java tak >>>=
. Musi być lepszy powód tego zaniedbania.
Od 15.26 Operatory przypisania :
Istnieje 12 operatorów przypisania; […]
= *= /= %= += -= <<= >>= >>>= &= ^= |=
Pojawiła się uwaga, że gdyby &&=
i ||=
zostały zaimplementowane, byliby jedynymi operatorami, którzy nie oceniliby najpierw prawej strony. Uważam, że błędem jest założenie, że operator przypisania złożonego najpierw ocenia prawą stronę.
Od 15.26.2 Operatory przypisania złożonego :
Wyrażenie przypisania złożonego formularza
E1 op= E2
jest równoważne zE1 = (T)((E1) op (E2))
, gdzieT
jest typemE1
, z tą różnicą, żeE1
jest oceniane tylko raz.
Jako dowód poniższy fragment kodu zgłasza a NullPointerException
, a nie ArrayIndexOutOfBoundsException
.
int[] a = null;
int[] b = {};
a[0] += b[-1];