6 分支嵌套与switch
正在加载视频播放器…
GESP C++ 一级:分支嵌套与 switch 精讲
核心目标:掌握嵌套
if、switch语句的写法与执行流程,理解悬空else、break穿透、循环嵌套层次等易错点。
嵌套就是“里面再套一层”;switch是多路选择,靠break跳出,靠default兜底。
一、什么是分支嵌套
嵌套,就是在一个结构里面再写一个同类型或不同类型的结构。
一级常见嵌套:
| 嵌套类型 | 示例 | 常见用途 |
|---|---|---|
嵌套 if |
if 里面再写 if |
多条件判断 |
switch 嵌套 |
switch 里面再写 switch |
复杂菜单选择 |
二、嵌套 if
1. 基本形式
if (条件1) {
if (条件2) {
语句块;
}
}
示例:判断两个数都为正数
int a, b;
cin >> a >> b;
if (a > 0) {
if (b > 0) {
cout << "都为正数" << endl;
}
}
也可以写成:
if (a > 0 && b > 0) {
cout << "都为正数" << endl;
}
2. 嵌套 if-else
if (a > 0) {
if (b > 0) {
cout << "a正b正";
} else {
cout << "a正b非正";
}
} else {
if (b > 0) {
cout << "a非正b正";
} else {
cout << "a非正b非正";
}
}
3. 悬空 else
else 总是和最近的、未匹配的 if 配对。
if (a > 0)
if (b > 0)
cout << "都正";
else
cout << "a 不正";
这里的 else 实际和 if (b > 0) 配对,不是和 if (a > 0) 配对。
解决方法:加花括号。
if (a > 0) {
if (b > 0) {
cout << "都正";
}
} else {
cout << "a 不正";
}
一级重点:嵌套
if建议每个if、else都加{},避免悬空else。
4. 嵌套 if 求三个数最大值
int a, b, c;
cin >> a >> b >> c;
int maxv;
if (a > b) {
if (a > c) {
maxv = a;
} else {
maxv = c;
}
} else {
if (b > c) {
maxv = b;
} else {
maxv = c;
}
}
cout << maxv << endl;
更简单的写法:
int maxv = a;
if (b > maxv) maxv = b;
if (c > maxv) maxv = c;
cout << maxv << endl;
三、switch 语句
1. 基本语法
switch (表达式) {
case 常量1:
语句块1;
break;
case 常量2:
语句块2;
break;
case 常量3:
语句块3;
break;
default:
语句块4;
}
2. 执行流程
- 计算
switch后面表达式的值。 - 与各个
case后的常量比较。 - 匹配成功,从该
case开始执行。 - 遇到
break,跳出整个switch。 - 如果没有匹配,执行
default。 - 如果没有
default,什么都不做。
3. 示例:根据数字输出星期
int day;
cin >> day;
switch (day) {
case 1:
cout << "星期一";
break;
case 2:
cout << "星期二";
break;
case 3:
cout << "星期三";
break;
case 4:
cout << "星期四";
break;
case 5:
cout << "星期五";
break;
case 6:
cout << "星期六";
break;
case 7:
cout << "星期日";
break;
default:
cout << "输入错误";
}
4. 示例:简单计算器
char op;
int a, b;
cin >> a >> op >> b;
switch (op) {
case '+':
cout << a + b << endl;
break;
case '-':
cout << a - b << endl;
break;
case '*':
cout << a * b << endl;
break;
case '/':
cout << a / b << endl;
break;
default:
cout << "错误" << endl;
}
5. break 的作用
break 用于跳出 switch。
如果省略 break,会发生“穿透”:
int x = 2;
switch (x) {
case 1:
cout << "一";
case 2:
cout << "二";
case 3:
cout << "三";
default:
cout << "其他";
}
输出:
二三其他
因为匹配 case 2 后,没有 break,继续执行 case 3 和 default。
一级重点:
switch中每个case后面一般都要写break,除非故意利用穿透。
6. default 的作用
default 处理所有 case 都不匹配的情况,类似 if-else 中的 else。
switch (op) {
case '+':
// ...
break;
default:
cout << "未知运算符";
}
default 可以放在任意位置,但通常放在最后。
7. switch 的注意事项
switch后面的表达式必须是整数、字符或枚举类型。case后面必须是常量,不能是变量。- 每个
case后的常量不能重复。 break不能忘,否则穿透。switch不能直接判断范围,如case score >= 90是错误的。switch适合固定取值,不适合范围判断。
四、switch 与 if 的对比
| 项目 | if-else if |
switch |
|---|---|---|
| 判断条件 | 关系、逻辑、范围 | 固定取值相等 |
| 适合场景 | 成绩等级、范围判断 | 菜单、运算符、数字分支 |
| 条件类型 | 任意 bool 表达式 |
整数、字符 |
| 穿透 | 无 | 不写 break 会穿透 |
| 灵活度 | 高 | 较低 |
| 一级要求 | 重点掌握 | 会读会写简单题 |
选择建议:
- 范围判断用
if。 - 固定取值用
switch。 - 不确定时用
if。
五、嵌套与 switch 结合
switch 可以嵌套在 if 中,也可以嵌套在循环中。
1. if 嵌套 switch
if (a > 0) {
switch (op) {
case '+':
cout << a + b;
break;
default:
cout << "错误";
}
}
2. switch 嵌套 switch
switch (a) {
case 1:
switch (b) {
case 1:
cout << "11";
break;
default:
cout << "1x";
}
break;
default:
cout << "x";
}
一级中 switch 嵌套较少考,了解即可。
六、常见错误
-
悬空
elseif (a > 0) if (b > 0) cout << "都正"; else cout << "a 不正"; // else 和里面 if 配对解决:加花括号。
-
switch忘记breakcase '+': cout << a + b; // 缺少 break,会继续执行后面的 case -
case后使用变量case x: // 错误,case 后必须是常量 -
switch判断范围switch (score) { case score >= 90: // 错误 }范围判断应使用
if。 -
switch表达式类型错误switch (3.14) { // 错误,不能是浮点数 } -
default位置随意导致逻辑混乱
建议放在最后。 -
嵌套层次过深
一级代码尽量简洁,嵌套不超过 2~3 层。 -
输出格式错误
注意换行、空格,按题目要求输出。
七、阅读程序写结果
题目 1
int a = 5, b = 3;
if (a > 0) {
if (b > 0) {
cout << "A";
} else {
cout << "B";
}
} else {
cout << "C";
}
输出:
A
题目 2
int x = 2;
switch (x) {
case 1:
cout << "A";
break;
case 2:
cout << "B";
break;
case 3:
cout << "C";
break;
default:
cout << "D";
}
输出:
B
题目 3
int x = 2;
switch (x) {
case 1:
cout << "A";
case 2:
cout << "B";
case 3:
cout << "C";
default:
cout << "D";
}
输出:
BCD
题目 4
char op = '*';
int a = 3, b = 4;
switch (op) {
case '+':
cout << a + b;
break;
case '-':
cout << a - b;
break;
case '*':
cout << a * b;
break;
default:
cout << "错误";
}
输出:
12
题目 5
int x = 5;
switch (x) {
case 1:
cout << "1";
case 2:
cout << "2";
default:
cout << "其他";
}
输出:
其他
解释:没有匹配的 case,执行 default。
八、速查表
| 需求 | 写法 |
|---|---|
嵌套 if |
if (条件1) { if (条件2) { ... } } |
避免悬空 else |
每个 if、else 加 {} |
switch 基本结构 |
switch (表达式) { case 常量: ... break; default: ... } |
跳出 switch |
break |
| 默认分支 | default |
| 范围判断 | 用 if,不用 switch |
| 固定取值 | 用 switch |
九、总结
嵌套与 switch 是一级分支和循环结构的进阶内容。
- 嵌套就是结构里面再套结构。
- 嵌套
if中,else和最近的未匹配if配对,建议加花括号。 switch适合固定取值判断,case后必须是常量。switch中break用来跳出,忘了会穿透。default处理所有不匹配的情况。- 范围判断用
if,固定取值用switch。
复习时多练“阅读程序写结果”类题,重点注意嵌套层次、break、default 和输出格式。考试中先看清题目要求,再选择 if 还是 switch,最后逐行检查花括号、分号和换行。