Что (в спецификации) гарантирует, что «логические операторы без короткого замыкания на самом деле не будут короткими замыканиями? - PullRequest
6 голосов
/ 13 февраля 2012

Это напрямую связано с этим вопросом .
Существует множество ссылок / утверждений, что побитовые операторы при применении к логическим значениям не будут закорачиваться.Другими словами, boolean a = f() & g(), где f() и g() оба возвращают логическое значение, оба всегда будут оцениваться.
Однако, JLS говорит только:

15.22.2 Логические логические операторы &, ^, и |
Когда оба операнда a, ^ или |оператор имеет тип логический или логический, тогда тип выражения побитового оператора - логический.Во всех случаях операнды при необходимости подвергаются распаковке (§5.1.8).

Для &, значение результата равно true, если оба значения операнда имеют значение true;в противном случае результат равен false.

Для ^ значение результата равно true, если значения операнда отличаются;в противном случае результат равен false.

Для | значение результата равно false, если оба значения операнда имеют значение false;в противном случае результат верен.

Как это гарантирует, что оба операнда действительно вычисляются?Помимо xor, вы все еще можете ломать и возвращать результат, если один из аргументов (а это может быть second / right , являющийся первым оцениваемым) нарушает условие.
Например.a & b нужно будет только оценить b как ложное, чтобы оценить выражение как ложное.

Обратите внимание: я не спрашиваю, реализовано ли это таким образом (не замыкается накоротко) - это, безусловно,является.

Я спрашиваю:

Будет ли реализация с коротким замыканием нарушать языковой стандарт?

Ответы [ 2 ]

5 голосов
/ 13 февраля 2012

См. JLS 15.7.2 Оценка операндов перед операцией

Язык программирования Java также гарантирует, что каждый операнд оператора (кроме условных операторов)&&, || и? :), по-видимому, полностью вычисляются до выполнения какой-либо части самой операции.

Так что если у вас есть оператор &, оба операнды должны быть оценены до того, как будет вычислен окончательный результат.

Кроме того, раздел перед этим явно запрашивает, чтобы левый операнд любого двоичного оператора был оценен первым.

1 голос
/ 13 февраля 2012

JLS явно заявляет, что ярлык выполняется для условного или и условного и. Это объясняет поведение условных и / или в терминах побитовых и / и операторов. Таким образом, подчеркивается, что сочетание клавиш - это изменение в поведении от побитовых операторов.

Итак, я бы сказал, что использование ярлыков будет нарушать стандарт. Это определенно нарушило бы ожидания разработчиков.

15.24 Оператор условного или ||

Оператор && похож на & (§15.22.2), но оценивает свой правый операнд, только если значение его левого операнда равно true.

...