Так что для бинарных операторов в булевых, 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];