C++ · 控制结构
分支结构
用59、60、89、90逐项检查条件边界,解释if/else if的首个成立分支,以及独立if与分支链的区别。
条件与分支结构
生活中我们经常做判断:如果下雨,就带伞;否则不带。C++ 的 if 语句做的就是这件事。
基本形式:
if (条件) {
// 条件为真时执行
} else {
// 条件为假时执行
}多分支(else if):
if (score >= 90) {
cout << "优秀";
} else if (score >= 60) {
cout << "及格";
} else {
cout << "不及格";
}大括号 {} 括住的是一个"代码块"。如果只有一条语句可以省略大括号,但强烈建议始终加上大括号,避免误解。
else 和同一嵌套结构中最近的、尚未匹配 else 的 if 配对;大括号可明确归属。
switch 分支:需要按整数或枚举的离散值选择操作时,可使用 switch。case 标签必须是常量表达式,default 处理没有命中的情况。case 后不会自动结束,通常加 break;故意让多个 case 共用处理时可把标签相邻排列。
先检查边界,再检查分支顺序
约定分数为0到100:90分及以上为优秀,60分及以上为通过。if / else if 链只执行第一个条件成立的分支;把较宽的条件放前面,可能挡住后面的分支。
| 分数 | score >= 90 | score >= 60(需要时) | 输出 |
|---|---|---|---|
| 59 | 假 | 假 | retry |
| 60 | 假 | 真 | pass |
| 89 | 假 | 真 | pass |
| 90 | 真 | 不再检查 | excellent |
常见错误一:把 >= 60 写成 > 60,恰好60分会走错。错误二:先写 if (score >= 60),再写 else if (score >= 90),90分已被前一支接住,无法进入优秀分支。两个独立if则可能都执行,与if/else if链不同。
运行验证:阈值前后各测一次
#include <iostream>
#include <initializer_list>
int main() {
for (int score : {59, 60, 89, 90}) {
if (score >= 90) { std::cout << "excellent\n"; }
else if (score >= 60) { std::cout << "pass\n"; }
else { std::cout << "retry\n"; }
}
}先预测四行结果,再运行。示例中的循环只用来重复检查四个输入。
先自己判断,再展开答案
把 >= 60改为 > 60,四个输入中哪个结果会改变?
60从pass变成retry;59、89、90的结果不变。
先检查 >= 60再else if >= 90,95会输出什么?
输出pass。第一支已经成立,后面的条件不会再检查。
规则改成满12岁可报名,应选 age > 12还是 age >= 12?怎样测?
用age >= 12,检查11、12、13。这里只练习边界判断,不表示任何真实赛事的年龄规则。
分支与switch示例
例1:判断分数等级
#include <iostream>
using namespace std;
int main() {
int score;
cin >> score;
if (score >= 90) {
cout << "A" << endl;
} else if (score >= 80) {
cout << "B" << endl;
} else if (score >= 60) {
cout << "C" << endl;
} else {
cout << "D" << endl;
}
return 0;
}输入 85 时,85>=90 为假,85>=80 为真,输出 B,后续分支不再判断。
例2:if 省略大括号的陷阱
#include <iostream>
using namespace std;
int main() {
int x = 5;
if (x > 10)
cout << "big" << endl;
cout << "end" << endl; // 这行总执行!
return 0;
}没有大括号时,if 只控制紧跟的第一条语句。"end" 无论条件真假都会输出,这是大坑!
例3:switch 合并相同处理
#include <iostream>
using namespace std;
int main() {
int day = 6;
switch (day) {
case 6:
case 7: cout << "weekend" << endl; break;
default: cout << "weekday" << endl;
}
}约定 day 为 1 到 7,输出 weekend。6 与 7 共用一段处理;break 避免继续执行后面的分支。
提示
- if 后面的条件用小括号括起来,是必须的语法。
- 没有大括号的 if 只控制紧跟的一条语句,多条语句必须加大括号。
- else if 从上到下依次判断,一旦某个条件成立就执行对应块并跳过剩余分支。
- else 和最近的 if 配对(就近原则),嵌套 if-else 时务必用大括号明确层次。
- 条件里用 == 比较(两个等号),误写成 = 是赋值,逻辑完全不同。
先修知识
技术参考
范围说明
本站讲解由 InfoCode 编写,不是官方考纲;参考级别是本站映射,不代表官方等级、认证或参赛资格。练习记录不等于掌握或资格。
参考级别:GESP 1 级(本站映射)