C++ 运算符|=C++;
我偶然发现了C++中的以下构造:C++ 运算符|=C++;,c++,operators,boolean,C++,Operators,Boolean,我偶然发现了C++中的以下构造: bool result = false; for(int i = 0; i<n; i++){ result |= TryAndDoSomething(i); } 然后,仅当返回值计算为false,即在返回true之前没有其他调用时,才会调用该方法。因此,在一个调用返回true后,将不会执行其他调用 这是正确的解释吗?对于布尔值,产生与|相同的结果,但不会短路。始终计算|=的右操作数。它是赋值,而不是短路或求值 它相当于: result = resul
bool result = false;
for(int i = 0; i<n; i++){
result |= TryAndDoSomething(i);
}
然后,仅当返回值计算为false
,即在返回true
之前没有其他调用时,才会调用该方法。因此,在一个调用返回true
后,将不会执行其他调用
这是正确的解释吗?对于布尔值,
产生与|
相同的结果,但不会短路。始终计算|=
的右操作数。它是赋值,而不是短路或求值
它相当于:
result = result | TryAndDoSomething(i);
result = result || TryAndDoSomething(i);
不是:
result = result | TryAndDoSomething(i);
result = result || TryAndDoSomething(i);
在此上下文中,
x |=f()
(按位OR)和x=x | f()
(逻辑OR)之间的唯一区别是后者短路。在前者中,f()
将执行n次
,当然除非f()
抛出异常,但这是另一种情况
在|
版本中,一旦x
变为true
,将不再调用f()
。C++没有一个<代码> {=运算符,但是重要的是理解<代码> > = 和|=
作为旁注,如果您使用的是
bool
,则按位操作是安全的,因为标准规定true
和false
分别转换为整数1
和0
。因此,在这种情况下,唯一的区别是急切的评估与懒惰的评估。result |=Try()
是result=result | Try()的缩写代码>。您似乎理解的|
运算符,但|
运算符却大不相同。它的名称是按位或(与逻辑或相反)。它的作用与对操作数的每一位执行a=a | | b
相同,并且没有逻辑and/or所具有的快速救援功能。(它也非常快;和加法一样快或更快)。其他按位操作是&
(按位和:a=a和&b
,在每个位上)和^
(按位异或:a=(a!=b)
。您可以轻松地测试它。我刚打了,看起来所有的电话都打了,不只是第一个。@MooingDuck:是的。编辑以限制OP的上下文。你只需告诉他他的解释无效。|=是按位或,正如您所指出的。所以x |=1和x=x | 1是一样的。X | |=1;不会编译。@Ramhound:请重新阅读问题。@MooingDuck:这个问题只询问布尔值。我不知道OP是否知道按位或(更正的打字错误)@BenVoigt:Copy-Paste-FTL,这对他所做的事情似乎并不重要。如果你说他们对非布尔人有什么不同,我会很高兴得到答案,因为OP显然不知道按位或(更正的打字错误)@BenVoigt:Copy-Paste-FTL!谢谢可能是最准确的答案+1.