我在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}}后,将不会进行任何其他呼叫。
这是正确的解释吗?
答案 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
,则按位操作 是安全的,因为该标准指定true
和false
转换为分别为整数1
和0
。因此,在这种情况下唯一的区别是渴望和懒惰的评估。
答案 3 :(得分:0)
result |= Try()
是result = result | Try();
的缩写。您似乎理解的||
运算符,但|
运算符完全不同。它的名称是按位或(与逻辑或相反)。它具有与在操作数的每个位上执行a=a||b
相同的效果,并且没有逻辑和/或具有的快速救助功能。 (它也快速疯狂;比加法快或快)。其他按位运算为&
(每位上的按位和a=a&&b
),每个位上的^
(按位xor:a=(a!=b)
)。