Почему в Java нет составных версий условных и условных операторов?(&& =, || =) - PullRequest
77 голосов
/ 24 февраля 2010

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

Ответы [ 11 ]

0 голосов
/ 01 октября 2009

Разрешено в Ruby.

Если бы я догадался, я бы сказал, что он используется не часто, поэтому он не реализован. Другое объяснение может заключаться в том, что синтаксический анализатор смотрит только на символ перед =

...