我在下面有一个简单的代码:
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
任何人都可以解释为什么会这样吗?我以为它们应该具有相同的行为,但是如果使用|=
运算符,则不会发生短路。
答案 0 :(得分:2)
15.26.2. Compound Assignment Operators
不会引起短路:
首先,对左操作数求值以产生一个变量。如果 该评估突然完成,然后赋值表达式 由于相同的原因而突然完成;右边的操作数不是 评估,没有分配。
否则,将保存左侧操作数的值,然后保存 右手操作数被评估。
...
答案 1 :(得分:0)
在Java ||
具有a short-circuit的情况下,如果左侧为true
,则不会评估右侧-因为在这种情况下,右侧的值无关紧要。因此,在您的第一个示例中,从未调用hello()
。
第二个示例实际上是使用不同的运算符,即按位OR运算符|
不能造成短路,因为它用于对数字进行位运算(但也适用于布尔值)。如果将其扩展到v = v | hello()
,它将起到相同的作用。