【发布时间】:2011-04-15 16:09:13
【问题描述】:
我需要关于这个奇怪的运算符|= 的帮助。你能解释一下这段代码的作用吗?
@Override
public boolean addAll(Collection<? extends E> c) {
boolean result = false;
for (E e : c) {
result |= add(e);
}
return result;
}
【问题讨论】:
我需要关于这个奇怪的运算符|= 的帮助。你能解释一下这段代码的作用吗?
@Override
public boolean addAll(Collection<? extends E> c) {
boolean result = false;
for (E e : c) {
result |= add(e);
}
return result;
}
【问题讨论】:
它是以下的简写:
result = result | add(e);
| 是按位或运算符。
【讨论】:
boolean类型。但这并不是说最终效果有什么不同。
||) 短路,逻辑或 (|) 不短路。所以在这种情况下add(e) 总是被评估,不管result 是否已经为真。
代码使用add() 方法添加Collection 的所有成员,该方法返回boolean,指示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 变量:
@Override
public boolean addAll(Collection<? extends E> c) {
boolean result = false;
for (E e : c) {
result = add(e) || result;
}
return result;
}
所以我们将result 的旧值与add 的返回值进行逻辑或运算以获得新值。 (注意 - 我们希望 result 位于 || 的右侧;这是因为 || “短路”并且如果左侧是true)。因此,如果 add(e) 和 result 是相反的,它将不会评估右侧 - 即不运行 add() 方法 - 一旦 result 是 true。)
编写该方法的人决定他们希望尽可能简洁,因此他们进行了更改:
result = add(e) || result;
到:
result |= add(e);
等同于:
result = result | add(e);
| operator is a bitwise OR 与逻辑 OR 不同,除了布尔值,其效果基本相同,唯一的区别是 | 没有上述短路行为。
Java 中没有 ||= 语法,这就是使用按位 OR 的原因,尽管即使这样做也可能会出现上述相同的短路问题。
【讨论】:
|| 短路的要点。已更改答案以反映这一点。
它是 result = result | 的简写。添加(e)。管道是bitwise or 运算符。
【讨论】:
这是result 和add(e) 的按位或运算并将其分配回结果。速记符号而不是写result = result | add(e)
【讨论】:
or-assign 运算符 (|=) 将 LHS 上的变量设置为它之前包含的值 OR-ed 与评估 RHS 的结果。对于布尔类型(如本例所示),当值为真时,它会将变量更改为包含真(否则没有净效果)。它确实不短路评估。
该方法的总体效果是为参数集合的每个元素调用当前对象的 add 方法,如果任何对 add 的调用返回 true(即,如果实际添加了任何内容,则返回 true , 在对add的结果含义的合理假设下...)
【讨论】: