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ścitruewynikowej jest, jeśli obie wartości operandów sątrue; w przeciwnym razie wynik tofalse.Dla
|wartościfalsewynikowej jest, jeśli obie wartości operandów sąfalse; w przeciwnym razie wynik totrue.Dla
^wartościtruewynikowej 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= E2jest równoważne zE1 = (T)((E1) op (E2)), gdzieTjest typemE1, z tą różnicą, żeE1jest 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];