该用 || 而非 |:当操作数为布尔值或可转 bool 的整数且需逻辑或语义时,|| 支持短路、避免副作用、结果为 bool;| 用于整型位运算,无短路、结果为整型,混用会导致语义错误、空指针解引用等严重问题。

用 || 还是 |?先看表达式类型
如果操作数是布尔值(bool)或能隐式转为 bool 的整数(比如 0 / 1),且你只想判断“是否至少一个为真”,就该用 ||;如果操作数是整数,你要合并位模式(比如设置标志位、组合掩码),才该用 |。混用会导致语义错误或意外行为。
|| 会短路,| 不会
这是最常踩的坑:当左操作数已能确定结果时,|| 完全跳过右操作数的求值;而 | 总是计算两边,哪怕左边已是非零。
- 可能引发副作用:比如
ptr != nullptr || ptr->data > 0是安全的,但换成|就可能解引用空指针 - 影响性能:对开销大的函数调用,
heavy_check() || light_check()可能只执行一次,heavy_check() | light_check()必然执行两次 - 编译器通常不优化掉
|的右侧求值,即使逻辑上冗余
运算对象和结果类型不同
|| 的操作数会被上下文转换为 bool,结果恒为 bool;| 要求操作数是整型(int、unsigned char 等),结果类型是提升后的整型,值取决于二进制位组合。
-
true || false→true(bool) -
1 | 2→3(int,二进制01 | 10 = 11) -
5 || 0→true,但5 | 0→5,二者不可互换 - 对指针:
ptr1 || ptr2合法(转为bool),ptr1 | ptr2编译报错(不支持指针按位或)
优先级差异会影响表达式分组
|| 优先级远低于 |,更低于算术和关系运算符。写条件表达式时不加括号极易出错。
-
a & b == 0 || c实际等价于(a & (b == 0)) || c,不是你想的((a & b) == 0) || c -
a | b == 0会被解析为a | (b == 0),因为==优先级高于|,而||优先级低于==,所以a || b == 0才是a || (b == 0) - 涉及混合运算时,宁可多加括号,也别依赖记忆优先级表
| 的场景集中在底层控制(如寄存器配置、权限掩码)、位图操作或加密算法;绝大多数条件分支、状态判断、空值检查都该无条件选 ||。漏掉短路特性或误把整数位运算当逻辑判断,是调试时最难定位的逻辑 bug 来源之一。C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











