Java | =运算符问题

时间:2010-09-22 10:54:16

标签: java operators

我需要有关这个奇怪的运算符|=的帮助。你能解释一下这段代码的作用吗?

@Override
public boolean addAll(Collection<? extends E> c) {
    boolean result = false;
    for (E e : c) {
        result |= add(e);
    }
    return result;
}

5 个答案:

答案 0 :(得分:6)

这是一个简写:

result = result | add(e);

|是按位OR运算符。

答案 1 :(得分:2)

它是result = result |的简写添加(E)。管道是bitwise or运算符。

答案 2 :(得分:2)

代码正在使用Collection方法添加add()的所有成员,该方法返回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位于||的右侧;这是因为||“短路”并且不会检查{||的右侧1}}如果左侧是true)。因此,如果add(e)result是另一种方式,则不会评估右侧 - 即不运行add()方法 - 一旦resulttrue 。)

无论是谁写了这种方法,他们都希望尽可能简洁,以便改变:

result = add(e) || result;

为:

result |= add(e);

与:

相同
result = result | add(e);

| operator is a bitwise OR与逻辑OR不同,除了效果基本相同的布尔值之外,唯一的区别是|没有上面提到的短路行为。

Java中没有||=语法,这就是使用按位OR的原因,尽管它确实会有上述相同的短路问题。

答案 3 :(得分:0)

它是resultadd(e)的按位OR-ing并将其分配回结果。简写符号而不是写result = result | add(e)

答案 4 :(得分:0)

or-assign运算符(|=)将LHS上的变量设置为先前包含的值,或者评估RHS的结果。对于布尔类型(如本例所示),当值为true时,它将变量更改为包含true(否则没有净效果)。它短路评估。

该方法的总体效果是为参数集合的每个元素调用当前对象的add方法,并且如果对add的任何调用返回true,则返回true(即,如果在add ...)

的结果含义的合理假设下,实际上已经添加了任何内容