Операторы коротких замыканий всегда выполняются слева направо?

Так что, если код:

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

Другие вопросы по тегам