Что (в спецификациях) гарантирует, что "логические операторы без короткого замыкания на самом деле не будут замыкаться?

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

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

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

Для ^ значение результата истинно, если значения операндов различны; в противном случае результат будет ложным.

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

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

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

Я спрашиваю:

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

6
задан Community 23 May 2017 в 11:53
поделиться