C++ 算法考级专栏
真题分析、矩阵探测、递归回溯与基础语法
🎨 视觉封面【GESP】C++二级考试大纲知识点梳理, (7)多层分支结构
程序并不总是一条直线走到底,经常需要根据情况“拐弯”。一级考试要求掌握简单的 if,而二级考试的难度立刻升级到了多层嵌套。这就是逻辑思维能力的体现。本篇详细剖析大纲第 7 条考点。
(7)掌握多层分支结构,掌握 if 语句、if...else 语句、switch 语句,及相互嵌套的方法。 {: .prompt-info}
二级考点系列:
- 【GESP】C++二级考试大纲知识点梳理, (1)计算机存储的基本概念及分类
- 【GESP】C++二级考试大纲知识点梳理, (2)计算机网络的基本概念及分类
- 【GESP】C++二级考试大纲知识点梳理, (3)计算机程序设计语言相关知识
- 【GESP】C++二级考试大纲知识点梳理, (4)流程图
- 【GESP】C++二级考试大纲知识点梳理, (5)编码与 ASCII
- 【GESP】C++二级考试大纲知识点梳理, (6)数据类型转换
- 【GESP】C++二级考试大纲知识点梳理, (7)多层分支结构
- 【GESP】C++二级考试大纲知识点梳理, (8)多层循环结构
- 【GESP】C++二级考试大纲知识点梳理, (9)常用数学函数 {: .prompt-tip}
一、多层分支结构 (Nested if-else)
所谓的“多层分支”,通俗点说就是套娃:在 if 或 else 的大括号里,再写 if。
这通常用于处理多维度或递进式的判断条件。
1.1 语法结构
if (条件A) {
if (条件B) {
// 条件A 和 条件B 都满足
} else {
// 条件A 满足,但 条件B 不满足
}
} else {
// 条件A 不满足
}
1.2 经典案例:闰年判断
判断某一年是否为闰年,是嵌套分支的经典练兵场。
规则:
- 能被 4 整除。
- 但(如果是整百年)必须能被 400 整除。
写法 1:逻辑运算符(扁平化,推荐)
if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) {
cout << "是闰年";
}
写法 2:嵌套结构(层层递进,考点所在)
if (year % 4 == 0) {
// 可能是,还得看是不是整百
if (year % 100 == 0) {
// 是整百,那得看能不能被400整除
if (year % 400 == 0)
cout << "是闰年";
else
cout << "不是闰年";
} else {
// 能被4整除且不是整百
cout << "是闰年";
}
} else {
cout << "不是闰年";
}
虽然写法 2 看着繁琐,但它清晰展示了判断的步骤。在复杂的业务逻辑中,嵌套结构往往比一个超长的 && / || 表达式更容易阅读和调试。
1.3 悬空 else 问题 (Dangling else)
这是一个经典的 C++ 坑点。原则:else 总是与最近的、未配对的 if 结合。
if (A)
if (B)
cout << "B";
else // 这个 else 属于谁?
cout << "C";
答案:这个 else 属于 if(B)!如果 A 为真且 B 为假,输出 C。如果 A 为假,啥也不输出。
建议:无论只有一行代码还是多行,永远加上大括号 {},这样能彻底杜绝歧义。
if (A) {
if (B) {
cout << "B";
} else {
cout << "C";
}
}
二、Switch 语句
switch 是一种专门用于多选一的结构,特别适合判断整型或字符型的具体数值(离散值)。
2.1 语法结构
switch (表达式) {
case 常量1:
// 代码块 1
break; // 必不可少!
case 常量2:
// 代码块 2
break;
...
default:
// 如果上面都没匹配上,执行这里
break;
}
2.2 核心要点
-
类型限制:
switch括号里的表达式结果必须是 整数 (int, long, char)。不能是double,也不能是字符串。 -
Break 非常重要:
break的作用是跳出 switch。- 如果没有
break,程序会**“穿透” (Fall-through)**:继续向下执行下一个case的代码,不管条件是否匹配! - 利用穿透特性: 比如输入月份判断季节,3,4,5 月都是春季,可以写在一起。
CPP
switch (month) { case 3: case 4: case 5: cout << "春季"; break; }
-
Case 必须是常量:不能写
case a > 5:这种范围判断。
2.3 案例:简单的计算器
输入两个数和一个运算符 + - * /,输出结果。
double a, b;
char op;
cin >> a >> op >> b;
switch (op) {
case '+':
cout << a + b;
break;
case '-':
cout << a - b;
break;
case '*':
cout << a * b;
break;
// 注意除法分母不能为0
case '/':
if (b != 0) cout << a / b;
else cout << "Error";
break;
default:
cout << "无效符号";
}
三、if-else if 还是 switch?
| 场景 | 推荐使用 | 理由 |
|---|---|---|
范围判断 (如 score >= 90) |
if-else |
switch 没法直接处理范围 |
| 浮点数判断 | if-else |
switch 不支持 float/double |
特定点值匹配 (如 按下按键 1, 2, 3) |
switch |
代码结构更清晰,效率略高 |
| 复杂逻辑 (嵌套多) | if-else |
灵活性最强 |
四、备考技巧
- 缩进要规范:写嵌套分支时,一定要注意代码缩进。乱糟糟的格式会让你在检查逻辑时瞬间崩溃。
- 大括号不要省:虽然 C++ 允许单行省略
{},但考试或写复杂逻辑时,请务必加上。 - 注意边界:多层分支极其容易漏掉某些情况(比如
else没写全),写完代码后,试着在脑子里跑几个测试用例覆盖所有分支。
所有代码开源上传至 GitHub:yummy-code 仓库 · GESP 专题站:GESP WIKI
欢迎加入:C++ GESP/CSP 考级答疑群(688906745) 与 Java/Python交流群(982860385),点击可直接加群。
猜你想读 · 相关文章推荐
【GESP】C++二级考试大纲知识点梳理, (1)计算机存储的基本概念及分类
GESP C++二级官方考试大纲中,共有9条考点,本文针对C++(1)号知识点进行总结梳理。 (1)了解计算机存储的基本概念及分类,了解随机存储器(RAM)、只读存储器(ROM)和高速缓冲存储器(Cache)的功能及区别。 {: .prompt-info} 二级考点系列: - 【GESP】C++二级考试大纲知识点梳理,...
【GESP】C++二级考试大纲知识点梳理, (2)计算机网络的基本概念及分类
GESP C++二级官方考试大纲中,共有9条考点,本文针对C++(2)号知识点进行总结梳理。 (2)了解计算机网络的概念,了解计算机网络的分类(广域网(WAN)、城域网(MAN)、局域网(LAN)),了解计算机网络的层级结构及作用(TCP/IP 四层模型与 OSI七层模型),了解不同层级的重要协议,了解 IP 地址及子...
【GESP】C++二级考试大纲知识点梳理, (3)计算机程序设计语言相关知识
GESP C++二级官方考试大纲中,共有9条考点,本文针对C++(3)号知识点进行总结梳理。 (3)了解程序设计语言的几大分类及特点(机器语言、汇编语言、高级语言),了解常见的高级语言(C++、Python 等)。 {: .prompt-info} 二级考点系列: - 【GESP】C++二级考试大纲知识点梳理, (1)...
OneCoder (lihongzheshuai)
一个中年人的自留地,记录学习 C++、GESP/NOI、Java、Python 与算法架构的心得体会。本站唯一网址:coderli.com