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