短路操作员是否一直从左到右执行



因此,如果代码:

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

最新更新