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

时间:2012-01-26 16:02:32

标签: c++ operators boolean

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

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

我认为这个|=是OR运算符的快捷方式,如果result中至少有一个调用true,那么TryAndDoSomething最后会等于true已经返回true

但现在我想知道是否有多个电话可以实际返回result = result || TryAndDoSomething(i); 。实际上,如果我们将操作扩展为:

false

然后只有在返回评估为true时,即在返回true之前没有其他调用的情况下才会调用该方法。因此,在一次呼叫返回{{1}}后,将不会进行任何其他呼叫。

这是正确的解释吗?

4 个答案:

答案 0 :(得分:30)

这是bitwise OR任务,而不是短路或评估。

相当于:

result = result | TryAndDoSomething(i);

不会

result = result || TryAndDoSomething(i);

答案 1 :(得分:11)

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

答案 2 :(得分:4)

x |= f()(按位OR)和x = x || f()(逻辑OR)之间的唯一区别是后者是短路的。在前者中,f()将被执行n次 - 除非当然f()引发异常,但这是另一个故事。

||版本中,f()成为x后,true将不再被调用。 C ++没有||=运算符,但重要的是要理解|=||=(如果它存在)会因此而具有不同的语义。 |=不仅仅是失踪||=的替代品。

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

答案 3 :(得分:0)

result |= Try()result = result | Try();的缩写。您似乎理解的||运算符,但|运算符完全不同。它的名称是按位或(与逻辑或相反)。它具有与在操作数的每个上执行a=a||b相同的效果,并且没有逻辑和/或具有的快速救助功能。 (它也快速疯狂;比加法快或快)。其他按位运算为&(每位上的按位和a=a&&b),每个位上的^(按位xor:a=(a!=b))。