Почему в 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 имеет>>>=
, Должна быть более веская причина для этого упущения.
От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];