【发布时间】:2011-03-10 07:04:29
【问题描述】:
换句话说,以下两个语句的行为方式是否相同?
isFoobared = isFoobared && methodWithSideEffects();
isFoobared &= methodWithSideEffects();
我意识到我可以写一个测试,但有人可能会立即知道这一点,而其他人可能会觉得答案很有用。
【问题讨论】:
标签: java short-circuiting
换句话说,以下两个语句的行为方式是否相同?
isFoobared = isFoobared && methodWithSideEffects();
isFoobared &= methodWithSideEffects();
我意识到我可以写一个测试,但有人可能会立即知道这一点,而其他人可能会觉得答案很有用。
【问题讨论】:
标签: java short-circuiting
不,|= 和 &= 不会短路,因为它们是 & 和 | 的复合赋值版本,不会短路。
JLS 15.26.2 Compound Assignment Operators
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)【讨论】:
True and False。这是使分配部分有用的 8 个案例中的 1 个。在其他 7 种情况下,不需要结果,因为它不会改变。当然是 | and & 是有意义的,因为您也可以将它们用于按位或/和,从而执行一些有用的操作。
不,他们没有,因为x &= y 是x = x & y 的缩写,而x |= y 是x = x | y 的缩写。 Java 没有 &&= 或 ||= 运算符可以满足您的需求。
& 和 | 运算符(以及 ~、^、<<、>> 和 >>>)是 bitwise operators。对于 any 整数类型,表达式x & y 将执行 按位 和运算。同样,| 执行按位或。要执行按位运算,数字中的每个位都被视为布尔值,1 表示true,0 表示false。因此,3 & 2 == 2,因为3 在二进制中是0...011,而2 是0...010。同样,3 | 2 == 3。 Wikipedia 对不同的运算符有很好的完整解释。现在,对于布尔值,我认为您可以使用& 和| 作为&& 和|| 的非短路 等效项,但我无法想象你为什么要这样做。
【讨论】: