← 目录 / 第四章 · 分支结构 / 4.1 运算符

4.1 比较运算符与逻辑运算符

分支结构依赖条件判断,条件判断又依赖两类运算符:比较运算符负责比大小,逻辑运算符负责组合多个条件,是学好 if 和 switch 之前必须掌握的基础。

比较运算符与逻辑运算符

分支结构依赖条件判断,条件判断又依赖两类运算符:比较运算符用来比较两个值,结果是 truefalse逻辑运算符用来把多个简单条件组合成一个更复杂的条件。

4.1.1 比较运算符

运算符含义示例结果优先级
>大于5 > 3true6
<小于5 < 3false6
>=大于等于5 >= 5true6
<=小于等于3 <= 5true6
==等于(两个等号!)5 == 5true7
!=不等于5 != 3true7

比较运算符的结果本质上是一个 bool 类型的值(truefalse),可以直接存进 bool 变量,也可以直接放进 if 的括号里:

C++ · 比较运算符结果是 bool
1bool isPass = (85 >= 60); // isPass 存的就是 true
2cout << isPass; // 输出 1(C++ 里 true 打印出来是 1,false 是 0)

4.1.2 逻辑运算符

运算符含义说明示例优先级
&&且(AND)两个条件都为 true 才为 trueage>=6 && age<=1211
||或(OR)至少一个为 true 就为 truex==1 || x==212
!非(NOT)truefalsefalsetrue!(x > 0)2
🚨
高频错误:== 是比较(两个等号),= 是赋值(一个等号)。写成 if (a = 5) 是赋值不是比较,不会报错但逻辑完全错误,是最难发现的 bug 之一!

4.1.3 运算符优先级

上面两张表格最后一列的"优先级"数字,代表运算符结合的先后顺序——数字越小,越先被计算。把常用运算符从高到低排一排,能看出一个清晰的规律:

2 ! (非) 优先级很高,几乎总是第一个被计算
6 > < >= <= 比较大小,比逻辑运算符先算
7 == != 判断相等/不等,比 > < 稍低一点
11 && (且) 先把多个"且"的条件组合起来
12 || (或) 最后处理"或",优先级在这几个里最低

规律是:比较运算符永远比逻辑运算符先算。所以 age >= 6 && age <= 12 不需要额外加括号,编译器会自动先算出两个 >=/<=true/false,再用 && 把结果组合起来。而 &&|| 优先级更高,意味着 a && b || c && d 会先算两个 &&,再用 || 连接,等价于 (a && b) || (c && d)

💡
记不住优先级?加括号就对了:与其死记硬背这些数字,不如在条件复杂时主动加括号,比如写成 (a && b) || (c && d)。多余的括号不会有任何负面影响,却能让代码意图一目了然,也不用担心自己记错优先级。

4.1.4 短路求值

&&|| 有一个非常重要的特性——短路求值:一旦左边的结果已经能确定整个表达式的值,右边就不会再被计算

a == 0 && 10 / a > 1 ← a==0 已经是 false,&& 直接判定整体为 false,右边不会被计算
C++ · 短路求值避免除零错误
1int a = 0, b = 10;
2
3if (a != 0 && b / a > 1) // 安全:a!=0 为 false,右边不会执行,不会除零
4{
5 cout << "b 是 a 的两倍以上";
6}
📖
|| 的短路规则正好相反:&& 是"左边为 false 就短路",|| 是"左边为 true 就短路"——只要 || 左边已经是 true,整个表达式必然是 true,右边同样不会被计算。这个特性常用来把"检查条件是否安全"的判断写在前面,防止后面访问越界、除零等错误。

4.1.5 常见陷阱与易错点

把本节内容汇总成几条最容易踩坑的规则:

1
= 和 == 搞混:if (a = 5) 是把 5 赋值给 a,赋值表达式的结果是 5(非零即真),条件永远成立,编译器通常只给警告不报错,是极难发现的逻辑 bug。写条件判断时养成"字面量写在左边"的习惯(if (5 == a))可以让这类笔误变成编译错误。
2
依赖记忆中的优先级导致逻辑出错:条件复杂时最容易在心算优先级上出错,尤其是混用 &&|| 的情况。宁可多写几个括号,也不要让别人(包括未来的自己)猜测运算顺序。
3
依赖短路求值的副作用,却忘了检查顺序:a != 0 && b / a > 1 这种写法,"检查条件"必须写在前面,"依赖这个条件才安全的操作"写在后面。如果顺序写反成 b / a > 1 && a != 0,除零错误在检查之前就已经发生了。
4
浮点数不要直接用 == 比较:由于浮点数存储存在精度误差(后续章节会详细介绍),0.1 + 0.2 == 0.3 的结果很可能是 false。判断两个浮点数是否"相等",通常要判断它们的差值是否小于一个很小的阈值,而不是直接用 ==