在C++中,布尔类型的运算符 |= 是什么意思?

21

我在C++中偶然发现了下面的语法结构:

bool result = false;
for(int i = 0; i<n; i++){
  result |= TryAndDoSomething(i);
}

我原先认为这个|=是OR运算符的快捷方式,如果至少有一个对TryAndDoSomething的调用返回true,那么最终result将等于true

但现在我在想,是否可能有多个调用返回true。实际上,如果我们将操作扩展为:

result = result || TryAndDoSomething(i);

那么只有当返回值为false时才会调用该方法,也就是说,如果之前的任何一次调用都返回了true,则不会进行任何其他调用。因此,在返回true之后的一次调用后,将不会执行任何其他调用。

这是否是正确的解释?


1
你可以轻易地进行测试。我刚刚测试过,看起来所有的调用都被执行了,而不仅仅是第一个。 - Vilx-
4个回答

49

这是按位或赋值,而不是短路或运算。

它等同于:

result = result | TryAndDoSomething(i);

注意:

result = result || TryAndDoSomething(i);

1
可能是最准确的答案!+1 - EM-Creations

25
关于布尔值,| 产生的结果与 || 相同,但不会短路。 在 |= 的右操作数总是被计算。

@MooingDuck:这个问题只涉及布尔值。我不知道OP是否了解按位或运算,而且它似乎与他正在做的事情无关。 - Ben Voigt
如果您能说明非布尔值的区别,那么我会更满意这个答案,因为显然OP不知道按位或(已更正拼写错误)。 - Mooing Duck

8
在这个情况下,x |= f()(按位或)和x = x || f()(逻辑或)之间的唯一区别是后者短路。在前者中,f()将会被执行n次,除非当然f()抛出异常,但那是另外一个故事。
||版本中,一旦x变为truef()将不再被调用。C++没有||= 运算符,但重要的是要理解|=||=(如果存在)会因此具有不同的语义。 |= 不仅是缺失的||= 的替换。
附带说明,只要您使用bool,按位操作就是安全的,因为标准规定truefalse分别转换为整数10。因此,在这种情况下,唯一的区别是急切与懒惰评估。

@MooingDuck:没错。编辑后限制在原帖的上下文中。 - Jon Purdy
你只需要告诉他他的解释是无效的。如你所指出的,|= 是按位或运算符。因此,x |= 1 等同于 x = x | 1。X ||= 1; 将无法编译。 - Security Hound
@Ramhound:请再次阅读问题。 - Jon Purdy

1

result |= Try()result = result | Try(); 的简写。你似乎理解了 || 运算符,但是 | 运算符则有很大的不同。它的名称是按位或(与逻辑或相对)。它的作用就像对操作数的每个执行 a=a||b 一样,并且没有逻辑与/或具有的快速退出功能。(它也非常快;与加法一样快甚至更快)。其他按位运算包括 &(按位与:a=a&&b 对每个位)和 ^(按位异或:a=(a!=b) 对每个位)。


@BenVoigt:复制粘贴太快了!谢谢!已修复。 - Mooing Duck

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接