Это непосредственно навеяно этим вопросом.
Существует множество ссылок/утверждений, что битовые операторы, когда они применяются к булевым числам, не замыкаются. То есть другими словами boolean a = f() & g()
, где f()
и g()
оба возвращают boolean, оба всегда будут оценены.
Однако в JLS говорится только:
15.22.2 Булевы логические операторы &, ^ и |
Когда оба операнда оператора &, ^ или | имеют тип boolean или Boolean, тогда тип выражения побитового оператора является булевым. Во всех случаях операнды при необходимости подвергаются преобразованию без вставки (§5.1.8).Для & значение результата истинно, если оба значения операндов истинны; в противном случае результат будет ложным.
Для ^ значение результата истинно, если значения операндов различны; в противном случае результат будет ложным.
Для | значение результата ложно, если оба значения операнда ложны; в противном случае результат будет истинным.
Как это гарантирует, что оба операнда действительно оцениваются? Кроме xor
, вы все еще можете прервать и вернуть результат, если один из аргументов (а это может быть второй/правый, который оценивается первым) нарушает условие.
Например, для оценки выражения a & b
достаточно, чтобы b
стало ложным.
Обратите внимание: я не спрашиваю, реализуется ли это таким образом (не замыкается ли) - безусловно, да.
Я спрашиваю:
Будет ли реализация с замыканием нарушать языковой standard?