Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/164.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 运算符|=C++;_C++_Operators_Boolean - Fatal编程技术网

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

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

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++没有一个<代码> {=运算符,但是重要的是理解<代码> > = 和code>|=不仅仅是替换缺少的
|=


作为旁注,如果您使用的是
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.