Операторы коротких замыканий всегда выполняются слева направо?
Так что, если код:
if(f() && false) {
// never happens
}
Могу ли я быть всегда уверен, что f()
будет вызываться и никогда не будет оптимизирован компилятором?
1 ответ
javac
Компилятор делает очень мало оптимизации.
JIT может оптимизировать код, но в этом случае вы можете быть уверены, что &&
а также ||
всегда оцениваются слева направо.
Все бинарные операторы, кроме операторов присваивания, оцениваются слева направо
http://docs.oracle.com/javase/tutorial/java/nutsandbolts/operators.html
От JLS.
15.7. Порядок оценки
Язык программирования Java гарантирует, что операнды операторов, по-видимому, будут оцениваться в определенном порядке вычисления, а именно слева направо.
Рекомендуется, чтобы код не зависел от этой спецификации. Код обычно более понятен, когда каждое выражение содержит не более одного побочного эффекта в качестве самой внешней операции, и когда код не зависит от того, какое именно исключение возникает в результате вычисления выражений слева направо.
http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html