Java |=运算符问题
我需要有关此奇怪运算符的帮助Java |=运算符问题,java,operators,Java,Operators,我需要有关此奇怪运算符的帮助|=。你能给我解释一下这个代码的作用吗 @Override public boolean addAll(Collection<? extends E> c) { boolean result = false; for (E e : c) { result |= add(e); } return result; } @覆盖 public boolean addAll(Collection它是以下内容的缩写:
|=
。你能给我解释一下这个代码的作用吗
@Override
public boolean addAll(Collection<? extends E> c) {
boolean result = false;
for (E e : c) {
result |= add(e);
}
return result;
}
@覆盖
public boolean addAll(Collection它是以下内容的缩写:
result = result | add(e);
其中,
是按位OR运算符。它是对结果
和添加(e)
的按位OR运算,并将其赋回结果。使用速记符号代替编写结果=结果它是对结果=结果|添加(e)的速记。管道是运算符。OR赋值运算符(|=
)将LHS上的变量设置为其先前包含的值,或将其与RHS求值的结果合并。对于布尔类型(如本例中所示),当该值为真时,它将变量更改为包含真(否则不会产生净影响)。它不会短路求值
该方法的总体效果是为参数集合的每个元素调用当前对象的add
方法,如果对add
的任何调用返回true,则返回true(即,如果实际添加了任何内容,则在关于add
结果含义的合理假设下…)代码使用add()
方法添加集合的所有成员,该方法返回一个布尔值,指示add()
是否成功。addAll
方法所做的是,如果任何添加成功,则返回true
,如果所有添加失败,则返回false
。(这对我来说似乎很奇怪,因为如果所有的添加都成功,我只会返回true
,但我离题了。)
所以你可以这样做:
@Override
public boolean addAll(Collection<? extends E> c) {
boolean result = false;
for (E e : c) {
if (add(e)) {
result = true;
}
}
return result;
}
因此,我们在逻辑上对result
的旧值与add
的返回值进行OR运算,以获得新值。(注意-我们希望result
位于|124;
的右侧,这是因为|
“短路”如果左侧为true
),则不必检查|
的右侧。因此,如果add(e)
和result
是另一种方法,则它不会计算右侧-即不运行add()
方法-一旦result
是true
)
无论是谁编写了该方法,都决定要尽可能简洁,因此进行了更改:
result = add(e) || result;
致:
这与:
result = result | add(e);
除了效果基本相同的布尔型之外,逻辑OR不同,唯一的区别是|
没有上述短路行为
Java中没有| |=
语法,这就是为什么使用按位OR的原因,尽管即使它这样做了,也可能会有上面提到的相同的短路问题。如果你必须向非程序员解释这个问题。它会是什么?非程序员知道二进制数和或是什么意思吗?如果不知道,首先解释这些。如果是,然后对结果的内容和调用add(e)的结果的二进制表示进行按位或运算,并将答案存储在结果引用中。实际上,这是逻辑的或,因为它应用于boolean
类型。但这并不是说净效果有什么不同。因此,如果结果为真,并且每次调用add(e)时返回true,但其中一个不返回true,最终结果为false?@Donal:这是错误的。布尔or(|
)短路,逻辑or(|
)不短路。因此在本例中,添加(e)无论结果是否为真,
始终进行求值。对于短路版本,您希望在返回真值后不会进行进一步的添加,考虑到方法名称的隐含约定,这将是令人惊讶的…@Donal Fellows-关于|
短路的优点已经改变FWIW:我在大学里有个教授,如果你做了这样的事情,他会杀了你:if(add(e)){result=true;}:-)
result |= add(e);
result = result | add(e);