运算符 |= 表示 C++ 中的布尔值
Operator |= for a boolean in C++
我在C++偶然发现了以下结构:
bool result = false;
for(int i = 0; i<n; i++){
result |= TryAndDoSomething(i);
}
我认为这个|=
是 OR 运算符的快捷方式,如果这些对 TryAndDoSomething
的调用中至少有一个返回true
,那么result
最终将等于 true
。
但是现在我想知道是否不止一个电话实际上可以返回true
.事实上,如果我们将操作扩展为:
result = result || TryAndDoSomething(i);
则仅当返回的计算结果为 false
时,即如果之前没有其他调用true
,才会调用该方法。因此,在一个调用返回true
后,不会进行其他调用。
这是正确的解释吗?
它是按位 OR 赋值,而不是短路 OR 求值。
它相当于:
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
相同的影响,并且没有逻辑和/或具有的快速救助功能。(它也是疯狂的快;和加法一样快或更快(。 其他按位运算是&
(每个位上的按位和:a=a&&b
(和^
(每个位上的按位异或:a=(a!=b)
(。
- 在没有定义返回类型的函数中返回布尔值,并将结果保存在无错误的char编译中-为什么
- 变量定义到C++布尔值转换
- 如何确保在使用基于布尔值的两个方法之一调用方法时避免分支预测错误
- 重载更少,则运算符返回相反的布尔值
- 将此布尔值传递给此函数的最有效方法是什么?
- 如何设置 c++ 类的布尔值?
- 使用 MAKEWORD / MAKEWPARAM 使用布尔值而不是布尔值
- 将 10 个线程与原子布尔值同步
- 创建类似于布尔值的变量类型
- 布尔值向量的基于范围 for 循环
- 零点和布尔值之间的比较
- 简化对两个布尔值的 4 个 if/else 检查
- 无法创建带有布尔值和矢量的地图
- 对于完成布尔值设置为 true 后未停止的循环
- fstream / ifstream / ofstream 对象如何转换为布尔值
- C++:将值赋值给原始数据类型(例如布尔值)是原子操作吗?
- 为什么布尔值不能比作最后一点?
- 如何使用返回布尔值的函数?
- 将uintptr_t转换为布尔值会使 SSO 基准速度减慢数倍
- 布尔值始终评估为真