Итак, для двоичных операторов на булевых языках 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
оценивается только один раз.
Как доказательство, следующий фрагмент выдает NullPointerException
, а не ArrayIndexOutOfBoundsException
.
int[] a = null;
int[] b = {};
a[0] += b[-1];