第 8 课:分支结构
本课学习目标: 1. 掌握
if语句的基本语法,理解条件成立时执行、不成立时跳过。 2. 掌握if-else二选一结构及多分支else if的阶梯判断顺序。 3. 明确大括号{}在控制多条语句时的关键作用(没有大括号时,if只管紧跟的第一条语句)。 4. 了解switch分支语句及break缺失导致的“程序贯穿”现象。 5. 认识简单三目运算(条件 ? 表达式1 : 表达式2)。
一、 什么是分支结构?
生活中的逻辑:“如果下雨,就带伞;否则,不带伞。” 在 C++ 中,这种根据不同条件选择不同执行路径的机制就叫做分支结构。
二、 if 与 if-else 语句
1. 单分支 if 语句
- 基本格式:
cpp if (条件) { // 条件成立时执行的代码块 } - 特点:条件成立就执行大括号里的代码;如果条件不成立,整个
if块直接被跳过,什么都不做。
2. 双分支 if-else 语句(二选一)
- 基本格式:
cpp if (条件) { // 条件成立时执行 } else { // 条件不成立时执行 } - 经典应用(判断奇偶数):
cpp int n; cin >> n; if (n % 2 == 0) { cout << "even"; // 偶数分支 } else { cout << "odd"; // 奇数分支 }💡
if-else的两个分支绝对不会同时执行,必定二选一。
三、 多分支 else if(多路选择)
当情况不止两种(比如判断正数、负数、零),我们需要使用 else if。
int n;
cin >> n;
if (n > 0) {
cout << "positive";
} else if (n < 0) {
cout << "negative";
} else {
cout << "zero";
}
⚠️ 多分支核心考点:顺序至关重要! * 程序会从上到下依次判断。 * 一旦某个分支成立并执行了,后面的
else if和else会被直接跳过,再也不看了! * 避坑指南:写分数段判断(如优秀>=90,及格>=60)时,必须把更严格、更高的标准写在最前面。如果写成if (score >= 60) cout<<"及格"; else if (score >= 90) ...,那么考 95 分的人在第一关>=60就会被截胡,错判成“及格”。
四、 🚨 避坑指南:大括号 {} 的生死作用
在 C++ 中,如果没有写大括号 {},if 或 else 默认只控制紧跟在它后面的【唯一的一条语句】!
错误示范:
int n = -5;
if (n > 0)
cout << "A";
cout << "B"; // ⚠️ 这行代码不受 if 控管!无论 n 是否大于 0,它都会无条件执行!
- 如果输入
-5,屏幕上依然会打印出B。 - 规范建议:不论分支里面有几条语句,养成习惯强制加放大括号
{},能避免 80% 的粗心大意失分。
五、 switch 语句与 break 的“贯穿”现象
除了 if,C++ 还提供了 switch 用于多分支整数/字符匹配。
int d;
cin >> d;
switch (d) {
case 0:
cout << "星期日";
break; // 必须有 break!
case 1:
cout << "星期一";
break;
default:
cout << "其他";
break;
}
⚠️ 核心考点:没有写
break会怎么样? 如果某个case匹配成功,但后面忘记写break;,程序不会停下来,而是会继续顺流而下,执行后面所有case的代码!这种现象在专业上叫“程序贯穿(Fall-through)”。
六、 GESP 一级真题与例题精讲
练一练 1:多分支执行顺序
【题目】
下面程序输入 21 后,输出是( )。
int N;
cin >> N;
if (N % 3 == 0)
cout << "能被3整除";
else if (N % 7 == 0)
cout << "能被7整除";
else
cout << "不能被3和7整除";
A. 能被3整除
B. 能被7整除
C. 不能被3和7整除
D. 没有输出
正确答案:A 名师解析: 输入
21。先看第一个条件21 % 3 == 0,成立! 于是程序打印出“能被3整除”。因为这是else if阶梯分支,第一个满足后,后面的N % 7 == 0直接被忽略不看了。
练一练 2:没有大括号的控制范围
【题目】
下面程序输入 -5 后,输出是( )。
int n;
cin >> n;
if (n > 0)
cout << "A";
cout << "B";
A. A
B. B
C. AB
D. 无输出
正确答案:B 名师解析: 因为
if后面没有加大括号{},它生且只生控管紧跟它的第一条语句cout << "A";。第二条语句cout << "B";是独立于if之外的。输入-5时,n > 0不成立,跳过 A,但紧接着无条件执行并输出 B。
练一练 3:switch 语句贯穿陷阱
【题目】
下面程序输入 1 后,输出是( )。
int x;
cin >> x;
switch (x) {
case 1:
cout << "A";
case 2:
cout << "B";
break;
default:
cout << "C";
break;
}
A. A
B. AB
C. ABC
D. B
正确答案:B 名师解析: 输入
x = 1,精准匹配到case 1:,打印出A。但是!仔细看case 1后面没有写break!程序发生“贯穿”,继续向下执行case 2的内容,打印出B,直到遇到case 2的break才停下。所以最终输出AB。
—— 本文来自火龙信奥(义乌睿码科技):义乌青少年信息学奥赛与编程教育平台,专注 CSP-J/S、NOIP、GESP 竞赛培训,线上线下融合教学,助力编程升学。网址:hlcoding.com