在 Java 中,&= 和 |= 短路吗?
2022-09-01 03:15:26
换句话说,以下两个语句的行为方式是否相同?
isFoobared = isFoobared && methodWithSideEffects();
isFoobared &= methodWithSideEffects();
我意识到我可以写一个测试,但有人可能会不经意地知道这一点,其他人可能会发现答案很有用。
换句话说,以下两个语句的行为方式是否相同?
isFoobared = isFoobared && methodWithSideEffects();
isFoobared &= methodWithSideEffects();
我意识到我可以写一个测试,但有人可能会不经意地知道这一点,其他人可能会发现答案很有用。
否,并且不要短循环,因为它们是 和 的复合赋值版本,它们不短循环。|=
&=
&
|
JLS 15.26.2 复合赋值运算符
该形式的复合赋值表达式等价于 ,其中 是 的类型,只计算一次。
E1 op= E2
E1 = (T)((E1) op (E2))
T
E1
E1
因此,假设 ,的等价性为:boolean &
isFoobared &= methodWithSideEffects()
isFoobared = isFoobared & methodWithSideEffects(); // no shortcircuit
另一方面,做短电路,但莫名其妙的Java没有复合赋值版本。也就是说,Java 既没有也没有 。&&
||
&&=
||=
逻辑运算符 (和 ) 与它们的条件对应运算符 ( 和 ) 之间的区别在于前者不 “短路”;后者确实如此。也就是说,假设没有例外等:boolean
&
|
boolean
&&
||
&
并始终计算两个操作数|
&&
并有条件地评估正确的操作数;仅当正确的操作数的值可能影响二进制操作的结果时,才会计算正确的操作数。这意味着在以下情况下不会计算正确的操作数:||
&&
false
false
)||
true
true
)不,他们没有,因为 是 的缩写,也是 .Java没有或运算符可以做你想做的事。x &= y
x = x & y
x |= y
x = x | y
&&=
||=
和 运算符(以及 、 、 、 和 ) 是按位运算符。对于任何整数类型,表达式都将按位和运算。类似地,按位执行 or。要执行按位运算,请将数字中的每个位视为布尔值,并带有指示和指示 。因此,,因为 是二进制的,并且是 。同样地。维基百科对不同的运算符有很好的完整解释。现在,对于布尔值,我认为你可以使用和作为和的非短路等价物,但我无法想象为什么你会想要这样做。&
|
~
^
<<
>>
>>>
x & y
|
1
true
0
false
3 & 2 == 2
3
0...011
2
0...010
3 | 2 == 3
&
|
&&
||