所以如果代码:
if(f() && false) {
// never happens
}
我可以始终确定它f()
会被调用并且永远不会被编译器“优化”吗?
所以如果代码:
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