【发布时间】:2012-09-03 02:04:06
【问题描述】:
所以如果代码:
if(f() && false) {
// never happens
}
我能否始终确定 f() 将被调用并且永远不会被编译器“优化”?
【问题讨论】:
标签: java short-circuiting
所以如果代码:
if(f() && false) {
// never happens
}
我能否始终确定 f() 将被调用并且永远不会被编译器“优化”?
【问题讨论】:
标签: java short-circuiting
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
【讨论】: