Так что для бинарных операторов в булевых, Java имеет &, |, ^, &&и ||.
Кратко подведем итоги того, чем они занимаются:
- JLS 15.22.2 Булевы логические операторы &, ^ и |
- JLS 15.23 Оператор условного И &&
- JLS 15.24 Оператор условного ИЛИ ||
Для
&результирующее значение будет,trueесли оба значения операнда равныtrue; в противном случае результат будетfalse.Для
|результирующее значение будет,falseесли оба значения операнда равныfalse; в противном случае результат будетtrue.Для
^, значение результатаtrueесли значения операндов разные; в противном случае результат будетfalse.
&&Оператор подобен ,&но оценивает ее правый операнд только , если значение его левого операнда являетсяtrue.
||Оператор подобен|, но вычисляет правый операнд только , если значение его левого операнда являетсяfalse.
Теперь из всех 5 у 3 есть составные версии присваивания, а именно |=, &=и ^=. Итак, мой вопрос очевиден: почему Java не поддерживает &&=и ||=? Я считаю, что мне нужно больше, чем мне нужно&= и |=.
И я не думаю, что «потому что это слишком долго» - хороший ответ, потому что в Java есть >>>= . Для этого упущения должна быть более веская причина.
Начиная с 15.26 Операторы присваивания :
Есть 12 операторов присваивания; [...]
= *= /= %= += -= <<= >>= >>>= &= ^= |=
Было сделано замечание, что если &&=и ||=будут реализованы, то это будут единственные операторы, которые сначала не оценивают правую часть. Я считаю ошибочным представление о том, что составной оператор присваивания сначала оценивает правую часть.
Начиная с версии 15.26.2 Операторы составного присваивания :
Составное выражение присваивания формы
E1 op= E2эквивалентноE1 = (T)((E1) op (E2)), гдеT- типE1, за исключением того, чтоE1оно оценивается только один раз.
В качестве доказательства следующий фрагмент выдает a NullPointerException, а не ArrayIndexOutOfBoundsException.
int[] a = null;
int[] b = {};
a[0] += b[-1];