首页 > 解决方案 > Java中OR运算符的不同行为

问题描述

我在下面有一个简单的代码:

public class Foo {
    public static void main(String[] args) {
        boolean v = true;
        v = v || hello();
        System.out.println(v);
    }

    public static boolean hello() {
        System.out.println("inside hello");
        return true;
    }
}

它打印:

true

但如果我改变表达:

v = v || hello();

v |= hello();

它打印:

inside hello
true

谁能解释为什么会这样?我假设它们应该具有相同的行为,但在|=操作员的情况下,不会发生短路。

标签: java

解决方案


15.26.2. Compound Assignment Operators不会造成短路:

首先,评估左侧操作数以产生变量。如果这个求值突然完成,那么赋值表达式也会因为同样的原因而突然完成;不计算右侧操作数,也不发生赋值。

否则,将保存左侧操作数的值,然后计算右侧操作数。

...


推荐阅读