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)
在此上下文中x |= f()(按位或)和x = x || f()(逻辑或)之间的唯一区别是后者是短路的。在前者中,f()将执行n次数——当然除非f()抛出异常,但那是另一回事了。
在||版本中,f()一旦x变成了就不再被调用true。C++ 没有||=操作符,但重要的是要理解|=和||=(如果存在)因此会有不同的语义。|=不仅仅是缺失的替代品||=。
作为旁注,如果您使用的是bool,按位运算是安全的,因为标准指定true和 分别false转换为整数1和0。所以在这种情况下唯一的区别是急切和懒惰的评估。