短路规则是C++标准强制要求的行为:逻辑表达式一旦能确定真假,右侧子表达式必不执行;&&左侧为false时跳过右侧,||左侧为true时跳过右侧,且该行为不可重载,是语言铁律。

短路规则不是可选项,是 C++ 标准强制要求的行为:只要能确定整个逻辑表达式的真假值,右侧子表达式就一定不执行。
&& 的短路行为:左侧为 false 时,右侧完全跳过
当使用 && 时,C++ 从左到右求值。一旦左侧操作数转换为 false(即值为 0、空指针、false 等),整个表达式结果必为 false,右侧表达式不会被计算。
- 常见错误现象:写成
ptr != nullptr && ptr->data > 0却仍触发空指针崩溃 → 实际上这行代码本身是安全的;崩溃一定来自别处(比如ptr是野指针或已释放) - 典型用途:避免访问未初始化/已释放的资源,例如
vec.size() > i && vec[i] == x - 注意:右侧不执行 ≠ 右侧语法无效 ——
nullptr->field即使在false &&后面,也必须是合法语法(否则编译失败)
|| 的短路行为:左侧为 true 时,右侧完全跳过
|| 同样从左到右求值。左侧转为 true(非零、非空、true)后,整个表达式结果必为 true,右侧表达式跳过。
- 常见误用:把有副作用的表达式放在右侧,却依赖它一定执行,例如
found || (found = search(x))→ 若found已为true,search(x)根本不调用 - 实用场景:提供默认值或 fallback,如
config_value() || default_value(),仅当前者为假才调用后者 - 性能影响:合理利用可省去昂贵计算,但过度嵌套(如
a || b || c || d)可能掩盖真实控制流,降低可读性
优先级和括号混用时,短路仍按实际分组生效
短路发生在“每个 && 或 || 运算符”层面,而不是整个 if 条件。括号改变的是运算顺序,不取消短路。
立即学习“C++免费学习笔记(深入)”;
- 例如:
(a && b) || c:先算a && b(若a为false,b不执行),再根据结果决定是否执行c - 又如:
a && (b || c):先算a;若为true,再进入括号内,此时b || c自身也有短路 —— 若b为true,c不执行 - 容易踩的坑:以为
!a && b || c等价于!(a && b) || c→ 实际上!优先级高于&&,等价于(!a) && b || c
真正容易被忽略的是:短路只针对内置逻辑运算符 && 和 ||;自定义 operator&& 或 operator|| 在 C++ 中不允许重载(标准禁止),所以你永远不必担心重载破坏短路 —— 它是语言铁律,不是库实现细节。


















