因此,如果代码:
if(f() && false) {
// never happens
}
我能始终确保f()
会被调用,并且永远不会被编译器"优化掉"吗?
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