【问题标题】:Java |= operator question [duplicate]Java |= 运算符问题[重复]
【发布时间】: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;
}

【问题讨论】:

    标签: java operators


    【解决方案1】:

    它是以下的简写:

    result = result | add(e);
    

    | 是按位或运算符。

    【讨论】:

    • 如果您必须向非程序员解释这一点。会是什么?
    • 非程序员知道二进制数和OR是什么意思吗?如果不是,请先解释这些。如果是,则对 result 的内容和调用 add(e) 的结果的二进制表示进行按位或,并将答案存储在结果引用中。
    • 其实是逻辑或,因为它应用于boolean类型。但这并不是说最终效果有什么不同。
    • 那么如果结果为真并且每次调用 add(e) 返回真但没有返回真,那么最终结果是否为假?
    • @Donal:错了。布尔或 (||) 短路,逻辑或 (|) 不短路。所以在这种情况下add(e) 总是被评估,不管result 是否已经为真。
    【解决方案2】:

    代码使用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() 方法 - 一旦 resulttrue。)

    编写该方法的人决定他们希望尽可能简洁,因此他们进行了更改:

    result = add(e) || result;
    

    到:

    result |= add(e);
    

    等同于:

    result = result | add(e);
    

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

    Java 中没有 ||= 语法,这就是使用按位 OR 的原因,尽管即使这样做也可能会出现上述相同的短路问题。

    【讨论】:

    • 对于短路版本,您会期望在返回 true 后不再进行任何添加,考虑到方法名称的隐含合同,这将是令人惊讶的......
    • @Donal Fellows - 关于|| 短路的要点。已更改答案以反映这一点。
    • FWIW:我有一个大学教授,如果你这样做会杀了你: if (add(e)) { result = true; } :-)
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      这是resultadd(e) 的按位或运算并将其分配回结果。速记符号而不是写result = result | add(e)

      【讨论】:

        【解决方案5】:

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

        该方法的总体效果是为参数集合的每个元素调用当前对象的 add 方法,如果任何对 add 的调用返回 true(即,如果实际添加了任何内容,则返回 true , 在对add的结果含义的合理假设下...)

        【讨论】:

          猜你喜欢
          • 2011-10-20
          • 2012-08-23
          • 2011-11-06
          • 2013-09-07
          • 2014-05-10
          • 1970-01-01
          • 2015-01-16
          • 2017-06-23
          • 2013-06-20
          相关资源
          最近更新 更多