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