【发布时间】:2019-03-08 17:53:21
【问题描述】:
t*() 在此示例中始终返回 true,而 f*() 始终返回 false。
假设我们有以下表达式
if ( f1() || t1() || f2() || t2() ){
// do stuff
}
如果是这种情况,JVM 会优化执行并且只执行f1() 和t1(),因为它“理解”无论f2() 和t2() 产生什么,输入if 语句的要求是满足,因此无需进一步计算。
我正在编写这样的代码:
boolean b = false;
b |= f1(); // A
b |= t1(); // B
b |= f2(); // C
b |= t2(); // D
我的一位同事看到这一点并提到他不确定,但 Java 可能会优化语句 C 和 D,因为从语句 B 开始,b 始终是 true,这可能导致一些问题。
我进行了一些测试,似乎所有测试都正确执行(这是所需的行为),但我仍然想知道 为什么不进行优化?我想他可能是对的,JVM 明白一旦b 为真,对它的任何|= 操作都不会改变它的值。
【问题讨论】:
-
对于它的价值,如果编译器执行了您建议的操作,我会惊讶。如果我看到你描述的代码,我当然不会期望你这样做。
-
一个问题可能是,运算符
|=不是布尔值或(||),而是二进制或(|)... -
"如果是这种情况,JVM 会优化执行并且只执行" 这不是在 JVM 中完成的,它是语言的一部分。如果您查看字节码,方法调用之后将跳转到块之后。
-
我把
b |= f2()改成了b = b || f2(),它短路了。 -
@Sun 它确实跳过了对
f2()的评估,但整个语句仍在执行。
标签: java binary-operators conditional-execution