Это напрямую связано с этим вопросом .
Существует множество ссылок / утверждений, что побитовые операторы при применении к логическим значениям не будут закорачиваться.Другими словами, 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
как ложное, чтобы оценить выражение как ложное.
Обратите внимание: я не спрашиваю, реализовано ли это таким образом (не замыкается накоротко) - это, безусловно,является.
Я спрашиваю:
Будет ли реализация с коротким замыканием нарушать языковой стандарт?