逻辑或(||)采用短路求值,左操作数为真时右操作数不执行,影响副作用;而按位或(|)无短路,强制计算两边。误用|替代||可能导致空指针解引用、多余调用及副作用顺序错误。

逻辑或(||)的短路求值机制
因为 || 采用短路求值:只要左操作数为真(非零、非空指针、true),整个表达式结果就确定为 true,右操作数根本不会被计算。
不执行右操作数的真实影响
这不只是“省点性能”,而是直接影响副作用是否发生。常见踩坑点包括:
-
a++ || b++:若a初始值非零,b++完全不执行,b值不变 -
ptr != nullptr || ptr->data > 0:若ptr为空,ptr->data不会访问,避免崩溃——这是合理用法 -
validate_input() || log_error():若校验通过,错误日志函数压根不会调用
和按位或(|)的关键区别
| 是按位运算,无短路;它强制计算左右两边,且要求整型操作数。而 || 是逻辑运算,只关心真假值,支持任意可隐式转为 bool 的类型(如指针、智能指针、自定义类重载了 operator bool)。
误写成 | 替代 || 可能导致:
立即学习“C++免费学习笔记(深入)”;
- 空指针解引用崩溃(本该靠短路避开)
- 多余函数调用(比如耗时的 I/O 或网络请求)
- 违反预期的副作用顺序
编译器不会帮你发现这个逻辑依赖
即使你写的是 func1() || func2() 并依赖 func2() 在 func1() 失败时才运行,编译器也绝不会报错或警告——它只保证语义正确。一旦 func1() 意外返回 true,func2() 就静默消失。这种隐式控制流在多线程或状态机里尤其危险。


















