Java中OR运算符的不同行为

时间:2018-08-15 03:52:03

标签: java

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

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

任何人都可以解释为什么会这样吗?我以为它们应该具有相同的行为,但是如果使用|=运算符,则不会发生短路。

2 个答案:

答案 0 :(得分:2)

15.26.2. Compound Assignment Operators不会引起短路:

  

首先,对左操作数求值以产生一个变量。如果   该评估突然完成,然后赋值表达式   由于相同的原因而突然完成;右边的操作数不是   评估,没有分配。

     

否则,将保存左侧操作数的值,然后保存   右手操作数被评估。

     

...

答案 1 :(得分:0)

在Java ||具有a short-circuit的情况下,如果左侧为true,则不会评估右侧-因为在这种情况下,右侧的值无关紧要。因此,在您的第一个示例中,从未调用hello()

第二个示例实际上是使用不同的运算符,即按位OR运算符|不能造成短路,因为它用于对数字进行位运算(但也适用于布尔值)。如果将其扩展到v = v | hello(),它将起到相同的作用。