Java |= 运算符问题[重复]

问题描述 投票:0回答:5

我需要关于这个奇怪的运算符的帮助

|=
。你能给我解释一下这段代码的作用吗?

@Override
public boolean addAll(Collection<? extends E> c) {
    boolean result = false;
    for (E e : c) {
        result |= add(e);
    }
    return result;
}
java operators
5个回答
6
投票

它是以下内容的简写:

result = result | add(e);

|
是按位或运算符。


3
投票

代码使用

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
位于
||
的右侧;这是因为
||
“短路”并且如果左侧是
||
)。因此,如果
true
add(e)
是相反的,它不会评估右侧 - 即不运行
result
方法 - 一旦
add()
result
。)
写那个方法的人决定他们想要尽可能简洁,所以他们改变了:

true

至:

result = add(e) || result;

与:
相同

result |= add(e);

result = result | add(e); 运算符是按位或

,它与逻辑或不同,除了效果基本相同的布尔值,唯一的区别是 
| 没有上述短路行为。
Java 中没有

|

语法,这就是为什么要使用按位或,尽管即使使用了,它也可能会出现上述相同的短路问题。

    


2
投票
按位或

运算符。


0
投票
||=

result
的按位或运算,并将其赋值回结果。速记符号而不是写
add(e)
    


0
投票
result = result | add(e)

) 将 LHS 上的变量设置为其先前包含的值与 RHS 的评估结果进行或运算。对于布尔类型(如本例所示),它会将变量更改为在值为 true 时包含 true(否则没有实际效果)。它做

not
短路评估。 该方法的总体效果是为参数集合的每个元素调用当前对象的

|=

方法,如果对

add
的任何调用返回真(即,如果实际添加了任何东西,则返回真)对
add
结果含义的合理假设……)
    

© www.soinside.com 2019 - 2024. All rights reserved.