C++ 编程语法
程序并不总是一行一行顺序执行——有时需要根据条件来决定走哪条路。本章学习 if、if-else、多分支链、三元运算符和 switch 语句。
4.1
分支结构依赖条件判断,条件判断又依赖两类运算符:比较运算符用来比较两个值,结果是 true 或 false;逻辑运算符用来组合多个条件。
| 运算符 | 含义 | 示例 | 结果 | 优先级 |
|---|---|---|---|---|
| > | 大于 | 5 > 3 | true | 6 |
| < | 小于 | 5 < 3 | false | 6 |
| >= | 大于等于 | 5 >= 5 | true | 6 |
| <= | 小于等于 | 3 <= 5 | true | 6 |
| == | 等于(两个等号!) | 5 == 5 | true | 7 |
| != | 不等于 | 5 != 3 | true | 7 |
| 运算符 | 含义 | 说明 | 示例 | 优先级 |
|---|---|---|---|---|
| && | 且(AND) | 两个条件都为 true 才为 true | age>=6 && age<=12 | 11 |
| || | 或(OR) | 至少一个为 true 就为 true | x==1 || x==2 | 12 |
| ! | 非(NOT) | true 变 false,false 变 true | !(x > 0) | 2 |
== 是比较(两个等号),= 是赋值(一个等号)。写成 if (a = 5) 是赋值不是比较,不会报错但逻辑完全错误,是最难发现的 bug 之一!4.2
if 语句仅当条件值为 true 时才执行大括号内的代码块。条件为 false 时直接跳过。
| 1 | // 语法 |
| 2 | if (条件表达式) |
| 3 | { |
| 4 | // 条件为 true 时执行 |
| 5 | } |
| 6 | |
| 7 | // 示例 |
| 8 | int score = 85; |
| 9 | if (score >= 60) |
| 10 | { |
| 11 | cout << "及格了!" << endl; |
| 12 | } |
4.3
当条件不满足时,使用 else 指定另一条路。程序必走其中一条分支,不会两条都走。
| 1 | int score = 55; |
| 2 | if (score >= 60) |
| 3 | { |
| 4 | cout << "及格!" << endl; |
| 5 | } |
| 6 | else |
| 7 | { |
| 8 | cout << "不及格,继续努力!" << endl; |
| 9 | } |
4.4
需要判断多个条件时,可以在 if 和 else 之间插入任意个 else if,程序从上到下依次检查,一旦匹配就执行对应块并跳出,最后的 else 兜底。
| 1 | int score = 78; |
| 2 | if (score >= 90) |
| 3 | { |
| 4 | cout << "优秀" << endl; |
| 5 | } |
| 6 | else if (score >= 75) |
| 7 | { |
| 8 | cout << "良好" << endl; // score=78,匹配这里 ✓ |
| 9 | } |
| 10 | else if (score >= 60) |
| 11 | { |
| 12 | cout << "及格" << endl; |
| 13 | } |
| 14 | else |
| 15 | { |
| 16 | cout << "不及格" << endl; |
| 17 | } |
4.5
三元运算符是 if-else 的简洁写法,适合简单的二选一赋值场景,一行搞定:
| 1 | int a = 10, b = 20; |
| 2 | |
| 3 | int maxVal = (a > b) ? a : b; // maxVal = 20 |
| 4 | cout << "较大值是:" << maxVal << endl; |
| 5 | |
| 6 | // 等价的 if-else 写法(更长) |
| 7 | int maxVal2; |
| 8 | if (a > b) maxVal2 = a; |
| 9 | else maxVal2 = b; |
if-else。4.6
当需要根据一个变量的多种具体取值分别处理时,switch 比多个 if-else 更清晰,结构也更整齐。
case 结尾都要加 break,否则程序会继续执行下面的 case(称为"穿透",fall-through),大多数时候这是 bug!int、char 等)或枚举类型表达式,不能用 float 或 string。穿透大多数时候是 bug,但有一种情况下故意穿透非常实用——让多个 case 共享同一段代码,省去重复书写:
| 1 | int day = 3; |
| 2 | switch (day) |
| 3 | { |
| 4 | case 1: // 故意穿透:1~5 共享同一输出 |
| 5 | case 2: |
| 6 | case 3: |
| 7 | case 4: |
| 8 | case 5: |
| 9 | cout << "工作日\n"; |
| 10 | break; // 到这里才退出 |
| 11 | case 6: |
| 12 | case 7: |
| 13 | cout << "周末\n"; |
| 14 | break; |
| 15 | default: |
| 16 | cout << "错误输入\n"; |
| 17 | break; |
| 18 | } |
default 是保底选项,当所有 case 都不匹配时执行,类似于 else。它可以放在 switch 内的任意位置,但习惯上放最后,保持代码整洁。