运算符 |= 表示 C++ 中的布尔值

Operator |= for a boolean in C++

本文关键字:布尔值 C++ 表示 运算符      更新时间:2023-10-16

我在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后,不会进行其他调用。

这是正确的解释吗?

它是按位 OR 赋值,而不是短路 OR 求值。

它相当于:

result = result | TryAndDoSomething(i);

不:

result = result || TryAndDoSomething(i);

在布尔值上,|产生与||相同的结果,但不会短路。 始终评估|=的正确操作数。

在这种情况下,x |= f()(按位 OR(和 x = x || f()(逻辑 OR(之间的唯一区别是后者短路。在前者中,f()将被执行n次——当然,除非f()抛出异常,但那是另一回事了。

||版本中,一旦x变得truef()将不再被称为。C++没有||=运算符,但重要的是要了解|=||=(如果存在(因此具有不同的语义。 |=不仅仅是缺失||=的替代品。

作为旁注,如果您使用的是 bool ,则按位运算安全的,因为标准指定truefalse分别转换为整数10。因此,在这种情况下,唯一的区别是急评估与惰性评估。

result |= Try()result = result | Try();的缩写。 您似乎了解||运算符,但|运算符却大不相同。 它的名称是按位或(与逻辑或相对(。 它具有与对操作数的每个执行a=a||b相同的影响,并且没有逻辑和/或具有的快速救助功能。(它也是疯狂的快;和加法一样快或更快(。 其他按位运算是&(每个位上的按位和:a=a&&b(和^(每个位上的按位异或:a=(a!=b)(。