【问题标题】:Are short-circuits operators allways executed left to right?短路运算符总是从左到右执行吗?
【发布时间】:2012-09-03 02:04:06
【问题描述】:

所以如果代码:

if(f() && false) {
    // never happens
}

我能否始终确定 f() 将被调用并且永远不会被编译器“优化”?

【问题讨论】:

    标签: java short-circuiting


    【解决方案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

    【讨论】:

    • 您能否参考 java 规范中的内容,或者为什么我可以确定任何 java 编译器都不会想到“嘿,正确的操作数对于编译时是错误的,短路运算符被使用了 - 所以我会把它扔掉”
    • Oracle Java 教程还不够? ;) 阅读 JLS 通常要困难得多。
    • 实际上还不够,因为短路是一些可能具有特殊行为的特殊情况。但现在已经足够了。谢谢:3
    • 我认为关于清晰度的警告值得再次阅读。仅仅因为它工作正常并不意味着它是表达某事的最清晰的方式。
    • "建议代码不要过度依赖本规范。通常每个表达式最多包含一个副作用时,代码会更清晰"
    猜你喜欢
    • 2015-09-26
    • 1970-01-01
    • 2019-02-02
    • 2015-09-27
    • 2011-03-07
    • 2013-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多