Таким образом, для бинарных операторов в логических значениях Java имеет &
, |
, ^
, &&
и ||
.
Давайте подведем краткий обзор того, что они делают здесь:
Для &
результирующее значение равно 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];