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

Dun*_*ril 13 c++ boolean operators

我在C++中偶然发现了以下构造:

bool result = false;
for(int i = 0; i<n; i++){
  result |= TryAndDoSomething(i);
}
Run Code Online (Sandbox Code Playgroud)

我认为这|=是OR运算符的快捷方式,如果这些调用中至少有一个返回,result那么true它最终会相等.TryAndDoSomethingtrue

但现在我想知道是否可以实际返回多个电话true.实际上,如果我们将操作扩展为:

result = result || TryAndDoSomething(i);
Run Code Online (Sandbox Code Playgroud)

然后只有在返回求值时才会调用该方法false,也就是说,如果返回之前没有其他调用true.因此,在一次呼叫返回后true,将不会进行任何其他呼叫.

这是正确的解释吗?

Chr*_*ain 31

它是按位OR分配,而不是短路OR评估.

它相当于:

result = result | TryAndDoSomething(i);
Run Code Online (Sandbox Code Playgroud)

不:

result = result || TryAndDoSomething(i);
Run Code Online (Sandbox Code Playgroud)


Ben*_*igt 11

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


Jon*_*rdy 5

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

||版本中,f()一旦x变成了就不再被调用true。C++ 没有||=操作符,但重要的是要理解|=||=(如果存在)因此会有不同的语义。|=不仅仅是缺失的替代品||=

作为旁注,如果您使用的是bool,按位运算安全的,因为标准指定true和 分别false转换为整数10。所以在这种情况下唯一的区别是急切和懒惰的评估。