Почему в Java нет составных версий условных и условных операторов? (&& =, || =)
Так что для бинарных операторов на логических, 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];