程序并不总是一行一行顺序执行——有时需要根据条件来决定走哪条路。本节学习 if、if-else 和多分支 if-else if-else 链。
4.2
程序默认是一行一行顺序往下执行的,但很多逻辑需要"看情况"——分数及格才打印"及格",年龄够了才能办卡。if 语句就是让程序具备"看情况做事"能力的关键结构。
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 | } |
当条件不满足时,使用 else 指定另一条路。程序必走其中一条分支,不会两条都走,也不会一条都不走。
| 1 | int score = 55; |
| 2 | if (score >= 60) |
| 3 | { |
| 4 | cout << "及格!" << endl; |
| 5 | } |
| 6 | else |
| 7 | { |
| 8 | cout << "不及格,继续努力!" << endl; |
| 9 | } |
需要判断多个条件时,可以在 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 | } |
≥90,再判断 ≥75……),如果顺序颠倒(先判断 ≥60),所有分数只要及格就会全部落进第一个分支,后面的判断永远不会被执行到。如果 if 或 else 后面只有一条语句,C++ 允许省略大括号 {}:
| 1 | if (score >= 60) |
| 2 | cout << "及格"; // 只有一条语句,可以不写 {} |
if,但实际上只有紧跟着的第一条语句才受 if 控制,第二行不管条件是否成立都会执行:| 1 | int score = 30; |
| 2 | if (score >= 60) |
| 3 | cout << "及格"; // 只有这一行属于 if |
| 4 | cout << "恭喜过关!"; // ⚠️ 这行和 if 无关,无论如何都会执行 |
if 增加第二条语句时,只需要直接在花括号里添加,不会因为忘记补花括号而引入这类"看起来对、实际上错"的 bug。if 内部还可以再嵌套 if,用来表达"先满足条件 A,再在此基础上判断条件 B"这种层层递进的逻辑:
| 1 | int age = 15; |
| 2 | bool hasTicket = true; |
| 3 | |
| 4 | if (age >= 12) // 外层:先判断年龄 |
| 5 | { |
| 6 | if (hasTicket) // 内层:年龄够了,再判断是否有票 |
| 7 | { |
| 8 | cout << "可以入场"; |
| 9 | } |
| 10 | } |
这段逻辑其实也能用 else if 链或者一个 && 条件写出来(if (age >= 12 && hasTicket)),三种写法怎么选,可以参考这个原则:
else if 链更清晰;如果条件之间是"层层递进"的关系(必须先满足外层,才有必要判断内层),用嵌套 if 更符合逻辑本身的结构。嵌套层数一旦超过 2~3 层,代码会变得很难读,这时应该考虑用 && 合并条件,或者把内层逻辑提取成一个单独的函数(见后续章节)。把本节内容汇总成几条最容易踩坑的规则:
{},否则新加的语句会脱离 if 的控制。if 而不是 else if,即使前面已经匹配成功,程序仍然会继续检查后面每一个 if,浪费判断次数,某些情况下还可能被多个分支同时命中,产生意料之外的结果。&& 合并条件,或者提前用 if (!条件) continue/return; 排除不满足的情况(提前退出,减少嵌套),让主逻辑保持在同一层级。