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);