java |=操作员问题[重复]

nfeuvbwi  于 2023-04-19  发布在  Java
关注(0)|答案(5)|浏览(113)

此问题已在此处有答案

What does "|=" mean? (pipe equal operator)(6个回答)
7年前关闭。
我需要关于这个奇怪的运算符|=的帮助。你能给我解释一下这个代码是做什么的吗?

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

kgsdhlau1#

这是一个速记:

result = result | add(e);

其中|是按位OR运算符。

gcxthw6b

gcxthw6b2#

代码使用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的返回值进行逻辑OR运算,以获得新值。(注意:我们希望result位于||的右侧;这是因为||“短路”,并且如果左侧是true,则不会麻烦检查||的右侧。因此,如果add(e)result是相反的,如果resulttrue,则不会计算右侧-即不运行add()方法。)
不管是谁写的这个方法,他们决定要尽可能简洁,所以他们改变了:

result = add(e) || result;

致:

result |= add(e);

其与以下相同:

result = result | add(e);

| operator is a bitwise OR与逻辑OR不同,除了布尔值的效果基本相同,唯一的区别是|没有上述的短路行为。
Java中没有||=语法,这就是为什么使用按位OR,尽管即使它这样做了,它也可能会有上面提到的短路问题。

7vux5j2d

7vux5j2d3#

它是result = result的简写|add(e)。管道是按位或运算符。

xzv2uavs

xzv2uavs4#

它是resultadd(e)的按位或运算,并将其赋值回result。

hi3rlvi2

hi3rlvi25#

or-assign操作符(|=)将LHS上的变量设置为它先前包含的值,并与RHS的求值结果进行OR运算。对于布尔类型(如本例),当值为true时,它将变量更改为包含true(否则没有净效应)。它不会 * 不 * 短路求值。
该方法的总体效果是为参数集合的每个元素调用当前对象的add方法,如果对add的任何调用返回true,则返回true(即,如果实际添加了任何内容,在对add结果含义的合理假设下...)

相关问题