NOI C++ 课程体系 / 语法入门 / 第4讲
CSP-J 入门级 · 语法入门 · 分支结构语句专题

C++ 分支结构语句 完全指南

让程序学会"做选择" —— if 单分支、if-else 双分支、else if 多层分支、嵌套 if 与 switch 多选逐一讲透,条件判断、层级嵌套、break 防穿透一次看清。

6 大教学模块 2 大分支语句精讲 6 个精讲案例 5 大易错点 1 张速查表 15 道分层练习
本讲 · 第 8/56 讲分支结构语句
模块 01

情景导航

先用"路口红绿灯"的故事建立直觉,再用生活类比看清"判断与选择"的本质,最后给出分支结构的准确定义和一句好记的口诀。

故事故事引入 —— 十字路口的红绿灯

小强放学路上观察了学校旁的十字路口整整一个下午,发现红绿灯其实是个"选择大师",它一整天都在做同一件事:

红灯亮 → 所有车辆 停;绿灯亮 → 车辆 行;黄灯亮 → 没越过停止线的车辆 停下来等。

红绿灯从来不会"既停又行",它每一刻都根据"现在是哪个灯亮"这个条件,先判断,再选择一条路执行。

旁边的游乐园检票口更是厉害:身高不到 1.2 米 → 免票;1.2 米到 1.5 米 → 半价票;超过 1.5 米 → 全价票。每个人只能按一条规则进站,这就是"多档选择"。

"先看条件,再挑路走,一次只走一条 —— 红绿灯和检票口都是这个规矩!"

老师笑着揭秘:程序每天都在遇到一模一样的情况——判断分数决定及格不及格、判断奇偶给出不同回答、判断数字输出星期几……这些"按条件挑路走"的程序,用的就是 分支结构。

💡 这个故事告诉我们什么?

红绿灯和检票口有三个共同点,也正是分支结构的三个要素:

一有明确的"条件"(哪个灯亮、身高多少);二每个条件对应不同的"动作"(停或行、买哪种票);三每一刻只执行一条路(不会红灯还通行,也不会全价半价一起买)。

程序里的分支结构也是如此:先判断条件是否成立,再从几条路里挑一条执行,执行完再继续往下走。接下来我们就把"判断"和"选择"翻译成 C++ 语句。

类比生活类比 —— 红绿灯、岔路口、检票口与点菜单

把四种分支写法和身边的场景对一对号,判断逻辑一下子就清晰了:

🚦

红绿灯 · 有条件才行动

绿灯亮了才通行,不亮就不动。程序里"条件成立才执行"就是 if 单分支。

对应:if (条件) 语句
🛣

岔路口 · 二选一

走到岔路口,要么向左要么向右,必须选一条。这正是 if-else 双分支。

对应:if...else...
🎟

检票口 · 分档多选

按身高从上往下分档:先查最高档,再查下一档,查到哪一档就按哪一档办。

对应:if...else if...else
🍴

点菜单 · 对号入座

报出菜号直接对应一道菜,1 号是宫保鸡丁,2 号是鱼香肉丝,绝不串号。

对应:switch...case...
定义什么是分支结构

到目前为止我们写的程序都是 顺序结构:从第一行到最后一行逐条执行,一条都不跳过。可现实中的问题常常需要"看情况办事",这就轮到 分支结构 出场了。

结构名称执行方式本课关键词
顺序结构从上到下逐条执行cin、cout、赋值(第 3 讲)
分支结构根据条件真假,选择其中一条路执行if / else / switch(本课)
循环结构重复执行某段代码for / while(第 5 讲)

分支结构(也叫选择结构)的准确定义:程序先对某个条件进行判断,根据判断结果(真或假),从两条或多条路径中选择一条执行,执行完毕后汇合,继续往下走。

判断离不开 关系运算符:> < >= <= == !=,它们的运算结果只有两种——true(真)或 false(假)。C++ 中用非 0 表示真,0 表示假。例如 5 > 3 的结果是 true,5 == 3 的结果是 false。

分支结构口诀 分支判断先写 if,条件括号别忘啦;
成立执行语句组,不成立呀就跳它;
双分支加 else,多层 else if 连;
switch 多选看数值,break 守门别落下。

口诀里藏着本课的全部主角:if、else、else if、switch。下面我们就把它们一个一个请出来,看清各自的"内部构造"和"执行路线"。

模块 02

知识探究

逐一拆解 if、if-else、else if 多层分支、嵌套 if 与 switch 的语法和执行路线,再看 6 个由浅入深的案例把常见写法一次练熟。

1if 单分支语句 —— 成立才执行

if 是英文"如果"的意思,它的作用正是:如果条件成立,就执行某段代码;不成立就直接跳过。标准写法是:

if (score >= 60) { cout << "及格"; }
if:分支关键字,带头人 (条件):必须用括号包住,结果是真或假 { 语句组 }:条件成立时才执行

使用时牢记五个要点:

要点说明
条件必须加括号if (x > 0) 的括号一个不能少,写成 if x > 0 直接编译报错
条件结果是真假常用 > < >= <= == != 产生 true / false;非 0 为真,0 为假
成立执行语句组条件为真,执行花括号里的全部语句,然后继续往下
不成立直接跳过条件为假,整个语句组被跳过,直接执行 if 后面的语句
花括号建议常写if (x > 0) cout << "正"; 只管一条语句时可省括号,但加上永远不出错
条件为 true
  • 进入语句组逐条执行
  • 执行完继续往下走
  • 好比绿灯亮,车辆通行
条件为 false
  • 语句组整段被跳过
  • 直接执行 if 后面的语句
  • 好比红灯亮,原地等待

一句话记住:if 就像门卫——条件成立就放行语句组,不成立就整段拦下,程序继续走后面的路。

2if-else 双分支 —— 二选一

很多事情只有两种结果:及格或不及格、奇数或偶数、正面或反面。这时用 if-else 最方便:成立走一条路,不成立走另一条路,两条路必走其一。

if (score >= 60) { 及格处理 } else { 不及格处理 }
if:先判断条件 (条件):真或假 两个语句组:真假各走一条 else:否则,不带任何条件
要点说明
else 不带条件else 就是"否则"的意思,写 else (score < 60) 是错的
两条路二选一两个分支有且只有一个会执行,绝不会两个都执行
else 不能单飞else 必须紧跟在 if 后面,不能独立使用
花括号划清地盘每个分支的语句组都用花括号包住,谁管哪段一目了然
C++双分支示例:奇偶判断
#include <iostream>
using namespace std;
int main(){
    int n;
    cin >> n;
    if (n % 2 == 0) {
        cout << n << " 是偶数" << endl;
    } else {
        cout << n << " 是奇数" << endl;
    }
    return 0;
}
运行结果
输入:8
输出:8 是偶数

解读:n % 2 是 n 除以 2 的余数,余数为 0 说明是偶数,条件成立走 if 分支;否则走 else 分支。一个数非奇即偶,正好二选一。

3else if 多层分支 —— 分档评级

两种结果不够用怎么办?比如成绩要分成 A、B、C、D、E 五档。这时用 else if 把多个条件一层一层排下去,像下楼梯一样逐档判断:

if (score >= 90) { A } else if (score >= 80) { B } else if (score >= 70) { C } else { D }
第一档:最严格的条件写在最前 else if:否则如果,可连写多层 else:前面全不成立时的保底
执行规则说明
自上而下逐条判断从第一个条件开始,按书写顺序一个接一个检查
一旦成立立即停止进入该分支执行,后面所有条件全部跳过,不再判断
末尾 else 兜底前面所有条件都不成立时,执行 else 分支(可省略)
顺序必须从严到宽score >= 90 必须写在 score >= 80 前面,否则 95 分会被误判成 B 档
形象记忆:多层分支像下楼梯——从最高档开始逐层判断,一旦够格就踏进那一档,下面的台阶看都不看。

特别提醒:判断"分数在 80 到 90 之间"不能写成数学里的连写 80 <= score < 90,C++ 不认!必须拆成两个条件用 &&(并且)连接:score >= 80 && score < 90。这个陷阱在学习检测里还会重点讲。

4嵌套 if —— 判断里面套判断

有些问题要"过两关":先判断要不要买票,再判断买全价还是半价。这时可以在 if 的分支里 再写一个 if,形成"判断里面套判断",这就是 嵌套 if。

C++嵌套 if 示例:游乐园门票
#include <iostream>
using namespace std;
int main(){
    int age;
    double height;
    cin >> age >> height;
    if (height >= 1.2) {          // 第一关:身高够 1.2 米要买票
        if (age <= 10) {          // 第二关:10 岁及以下半价
            cout << "半价票" << endl;
        } else {
            cout << "全价票" << endl;
        }
    } else {
        cout << "免票" << endl;
    }
    return 0;
}
要点说明
else 就近配对else 永远与它上面最近的、还没有配对的 if 配对,和缩进无关
缩进看清层次内层代码向右缩进,一眼看出谁套在谁里面
括号层层加嵌套时每一层都写全花括号,配对永远不会乱
口诀:else 兄弟排排站,就近配对不混乱;层层括号写整齐,嵌套再多也不难。
5switch 多选语句 —— 对号入座

当一个变量的取值只有有限的几种(比如星期 1~7、选项 A~D),用一长串 else if 太啰嗦,这时 switch 登场:拿着一个值,直接"对号入座"跳到对应的 case。

switch (day) { case 1: 语句; break; default: 语句; }
switch(表达式):只能是整数或字符 case 常量:一个个"号码牌" break:办完事立刻出门,防止穿透 default:所有号码都不匹配时执行
要点说明
表达式类型受限switch() 里只能是整数或字符型,如 int、char,不能是 double
case 后是常量case 后面必须是确定的常量(1、'A'),不能是变量或范围
break 防止穿透不写 break,程序会"穿透"下去,把下一个 case 的语句也执行了
default 是保底所有 case 都不匹配时执行,建议写在最后
case 可以共享多个 case 可以共用一段语句,适合"分组"场景

case 共享示例——查月份天数时,31 天的月份可以共用一个出口:

C++case 共享:月份天数(month 已读入)
switch (month) {
    case 1: case 3: case 5: case 7: case 8: case 10: case 12:
        cout << "31 天" << endl; break;
    case 4: case 6: case 9: case 11:
        cout << "30 天" << endl; break;
    case 2:
        cout << "28 天或 29 天" << endl; break;
}

比如 month 是 3,程序进入 case 3,那里没有语句也没有 break,继续"穿透"到下一行输出"31 天"后才 break 出门。七个 case 共用一段代码,省去了七遍重复。

6if 与 switch 怎么选
if 家族擅长
  • 范围判断:score >= 90、身高 1.2~1.5 米
  • 复杂条件组合:&&(并且)、||(或者)
  • 条件里有运算:n % 2 == 0
  • 只有两种结果时最简洁
switch 擅长
  • 离散值多选:星期、月份、菜单编号
  • 取值是整数或字符
  • 分支很多时结构更整齐
  • 记住:没写 break 会穿透
选择要诀:判断"范围"用 if,匹配"号码"用 switch;拿不准时就用 if,它什么场面都能应付。
7串起来看:一次判断的完整旅程

把成绩评级程序跑一遍:输入 85,看程序如何一层一层"下楼梯"找到正确的档位。

🎬 动画演示:输入 85 后的执行过程

1
int score; cin >> score; —— 把 85 读进变量 score
2
if (score >= 90) —— 85 >= 90 为 假,跳过第一档
3
else if (score >= 80) —— 85 >= 80 为 真,进入这一档!
4
cout << "B"; —— 输出 B,后面所有条件全部跳过,不再判断
5
程序结束 —— 85 分评级为 B,整个判断只走了两级半楼梯

解读:多层分支的执行路线是"自上而下、一次命中、立刻停止"。85 分虽然也满足 >= 70、>= 60,但因为先命中了 >= 80,后面的档位全部免检。

案例6 个由浅入深的案例

案例 1:及格判断 —— if 单分支初体验

题目:读入成绩,及格(60 分及以上)就输出鼓励语;无论是否及格,最后都输出"程序结束"。

C++及格判断
#include <iostream>
using namespace std;
int main(){
    int score;
    cin >> score;
    if (score >= 60) {
        cout << "及格,继续加油!" << endl;
    }
    cout << "程序结束" << endl;
    return 0;
}
运行结果(两次运行对比)
输入 75 → 及格,继续加油!
          程序结束
输入 48 → 程序结束(只有一行,鼓励语被跳过)

解读:if 只管花括号里的那一句。"程序结束"写在 if 外面,不受条件影响,无论真假都会输出。这就是单分支"成立才执行"的脾气。

案例 2:奇偶判断 —— if-else 二选一

题目:读入一个整数,判断它是奇数还是偶数。

C++奇偶判断
#include <iostream>
using namespace std;
int main(){
    int n;
    cin >> n;
    if (n % 2 == 0) {
        cout << "偶数" << endl;
    } else {
        cout << "奇数" << endl;
    }
    return 0;
}
运行结果
输入 9 → 奇数
输入 12 → 偶数

解读:n % 2 求除以 2 的余数。余数为 0 走 if 分支,否则走 else 分支——一个整数非奇即偶,两条路必走其一,这正是双分支的标准舞台。

案例 3:成绩评级 —— else if 下楼梯

题目:读入成绩,90 及以上输出 A,80~89 输出 B,70~79 输出 C,60~69 输出 D,其余输出 E。

C++成绩评级
#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 >= 70) {
        cout << "C" << endl;
    } else if (score >= 60) {
        cout << "D" << endl;
    } else {
        cout << "E" << endl;
    }
    return 0;
}
运行结果
输入 85 → B(满足 >= 80,后面档位不再判断)
输入 59 → E(前面四档全不成立,落到 else)

解读:条件从严到宽排列:能走到 >= 80 这一层的分数,一定已经确定不到 90,所以不必再写 < 90 的部分。这就是"楼梯写法"省掉一半条件的原因。

案例 4:游乐园门票 —— 嵌套 if 两关判断

题目:身高不足 1.2 米免票;身高够 1.2 米的游客里,10 岁及以下买半价票,其余买全价票。

C++游乐园门票
#include <iostream>
using namespace std;
int main(){
    int age;
    double height;
    cin >> age >> height;
    if (height >= 1.2) {
        if (age <= 10) {
            cout << "半价票" << endl;
        } else {
            cout << "全价票" << endl;
        }
    } else {
        cout << "免票" << endl;
    }
    return 0;
}
运行结果
输入 8 1.35 → 半价票(第一关过,第二关走 if)
输入 30 1.75 → 全价票(第一关过,第二关走 else)
输入 5 1.10 → 免票(第一关就被拦下)

解读:两个条件有"先后关系"——身高不达标时根本不考虑年龄。这种"先过第一关,再判断第二关"的场景就是嵌套 if 的主场。注意每一层都写全花括号,配对清清楚楚。

案例 5:星期几输出 —— switch 对号入座

题目:读入 1~7 的整数,输出对应的星期。

C++输出星期
#include <iostream>
using namespace std;
int main(){
    int day;
    cin >> day;
    switch (day) {
        case 1: cout << "星期一" << endl; break;
        case 2: cout << "星期二" << endl; break;
        case 3: cout << "星期三" << endl; break;
        case 4: cout << "星期四" << endl; break;
        case 5: cout << "星期五" << endl; break;
        case 6: cout << "星期六" << endl; break;
        case 7: cout << "星期日" << endl; break;
        default: cout << "输入错误!只能是 1~7" << endl;
    }
    return 0;
}
运行结果
输入 3 → 星期三
输入 9 → 输入错误!只能是 1~7(落到 default)

解读:每个 case 后都写了 break,办完事立刻出门,不会串到下一个 case。default 负责接住 1~7 以外的所有输入,让程序对错误输入也有交代。

案例 6:现场捉虫 —— 三处经典错误

题目:下面这段代码藏着 3 处本课高频错误,先自己找一找。

C++待捉虫的代码
int x;
cin >> x;
if (x = 5) {              // 第 1 处
    cout << "x 等于 5";
}
if (x > 0); {             // 第 2 处
    cout << "x 是正数";
}
switch (x) {
    case 5: cout << "五";  // 第 3 处
    case 6: cout << "六";
}
点击查看捉虫结果
第 1 处:if (x = 5) 用的是赋值号,等于"把 5 存进 x,再拿结果 5 当条件",非 0 即真,条件永远成立。判断相等必须用 ==:if (x == 5)。
第 2 处:if (x > 0); 末尾多了个分号,它让 if 的语句组变成"空语句",后面的花括号块与 if 再无关系,无论 x 是多少都会输出。删掉分号即可。
第 3 处:case 5 后面少了 break。x 为 5 时会先输出"五",再穿透到 case 6 输出"六",一共输出"五六"。在"五"后面补上 break;。
模块 03

实践应用

三道动手题:读代码写结果、给代码捉虫子、看要求写程序。先自己做,再点开答案对照。

实践 1 写输出

题目:看清 else 的归属 —— 下面程序输出什么?

C++待跟踪的程序
#include <iostream>
using namespace std;
int main(){
    int x = 3, y = 5;
    if (x > 2)
        if (y > 10) cout << "A" << endl;
        else cout << "B" << endl;
    return 0;
}
提示:这个 else 到底跟哪个 if 配对?记住"就近配对"原则,别被缩进骗了。
点击查看参考答案
答案:B
过程:x > 2 即 3 > 2 为真,进入内层;else 与最近的 if (y > 10) 配对,而 5 > 10 为假,所以走 else 输出 B。
点评:else 只认"最近的还没配对的 if",和缩进排版无关。想让它跟外层 if 配对,就给内层 if 套上花括号:if (x > 2) { if (y > 10) cout << "A"; } else cout << "B"; —— 花括号是消除歧义的最强武器。
实践 2 捉虫挑战

题目:下面这段代码藏着 3 处错误,把它们全部找出来

C++待捉虫的程序
int a;
cin >> a;
if (a > 0) {
    cout << "正数";
else                          // 第 1 行
    cout << "不是正数";
if (a = 0) cout << "是零";   // 第 2 行
if a < 0 cout << "负数";      // 第 3 行
点击查看参考答案
第 1 行:else 前面少了右花括号 }。if 的语句组没有闭合,else 找不到归属,编译直接报错。补上 } 即可。
第 2 行:if (a = 0) 用的是赋值号,效果是"把 0 存进 a,条件恒为假","是零"永远输出不了。判断相等要写 if (a == 0)。
第 3 行:条件没有加括号,if a < 0 是非法写法,必须写成 if (a < 0)。条件括号一个都不能少。
实践 3 编程题

题目:闰年判断 —— 读入年份,是闰年输出 Yes,否则输出 No

闰年规则:能被 4 整除但不能被 100 整除的年份是闰年;能被 400 整除的年份也是闰年。例如 2024 是闰年,1900 不是,2000 是。

提示:"能被 4 整除且不能被 100 整除"写成 y % 4 == 0 && y % 100 != 0,"能被 400 整除"写成 y % 400 == 0,两个大条件之间用 || 连接。
点击查看参考答案
C++参考代码
#include <iostream>
using namespace std;
int main(){
    int y;
    cin >> y;
    if ((y % 4 == 0 && y % 100 != 0) || y % 400 == 0) {
        cout << "Yes" << endl;
    } else {
        cout << "No" << endl;
    }
    return 0;
}
示例:输入 2024 → Yes;输入 1900 → No(能被 100 整除但不能被 400 整除);输入 2000 → Yes。
点评:&& 是"并且",|| 是"或者"。复杂条件先拆成小块,再用它们拼起来,最后给整体套一层括号,逻辑清清楚楚。这是 CSP-J 初赛和复赛的高频考点。
模块 04

总结提升

把五种分支写法浓缩成一张表、一句口诀,再用"求较大值的一题三解"检验你是否真正掌握了分支的精髓。

总结核心要点总结
写法语法格式分支数适用场合
if 单分支if (条件) {...}1(真执行,假跳过)只在特殊情况下处理
if-elseif (...) {...} else {...}2是非题、二选一
else if 多层if...else if...else...多分档、分级、范围多选
嵌套 ifif 里面再写 if多先过一关再判断下一关
switchswitch (x) {case ...: break;}多整数 / 字符的离散多选
分支结构口诀(再背一遍) 分支判断先写 if,条件括号别忘啦;
成立执行语句组,不成立呀就跳它;
双分支加 else,多层 else if 连;
switch 多选看数值,break 守门别落下。
拓展拓展案例 —— 求两个数较大值的一题三解

同样是"找出 a、b 中较大的数存进 m",分支能给出三种漂亮的解法:

C++一题三解:求较大值
#include <iostream>
using namespace std;
int main(){
    int a = 7, b = 12;
    int m1, m2, m3;
    // 解法一:if-else 正面硬刚
    if (a > b) { m1 = a; } else { m1 = b; }
    // 解法二:默认值法(先假设 a 大,发现 b 更大就更新)
    m2 = a;
    if (b > m2) { m2 = b; }
    // 解法三:三目运算符(if-else 的超简写,先混个脸熟)
    m3 = (a > b) ? a : b;
    cout << m1 << " " << m2 << " " << m3 << endl;
    return 0;
}
运行结果
12 12 12

解读:三种写法殊途同归。解法二"默认值法"看似多此一举,其实是后面循环课"从 n 个数里找最大值"的标准套路——先让第一个数当擂主,后面的数逐个上台挑战。解法三的 ? : 叫三目运算符,等价于 if-else,写起来最短。

🧠 思考与启发

红绿灯、检票口、考试成绩单,生活里的判断都有一个共同点:先有条件,后有行动。程序把这件事写成了 if 和 switch——"先判断,再选择,一次只走一条路"。

想一想:为什么 C++ 规定 else 必须与最近的 if 配对,而不是让程序员随意指定?提示:编译器需要一条明确、唯一、不用猜的规则,就像交通规则不能有两种解释。再想想:当分支多达十几个(比如判断 1~12 月),写一长串 else if 和写 switch,哪个读起来更整齐?把这两个问题的答案记在心里,它们会陪你走完整套课程。

模块 05

学习检测

5 个最容易丢分的判断陷阱、一张考前必背速查表,以及可以贴在文具盒上的知识点速记卡。

易错 1

条件里把赋值 = 当成比较 ==

if (x = 5) 不是"判断 x 是否为 5",而是"把 5 存进 x,再拿 5 当条件"——非 0 即真,条件永远成立。

错误写法
if (x = 5) {   // 恒为真
    cout << "是5";
}
正确写法
if (x == 5) {  // 判断相等
    cout << "是5";
}
口诀:单等赋值,双等比较;条件里面写双等,少写一个等号全盘错。
易错 2

范围条件连写:60 <= x <= 100

数学里的连写 C++ 不认:60 <= x <= 100 会先算 60 <= x 得到 0 或 1,再拿这个结果跟 100 比,恒为真。范围必须拆成两半用 && 连接。

错误写法
if (60 <= x <= 100) {
    // 恒为真,判断失效
}
正确写法
if (x >= 60 && x <= 100) {
    // 两个条件同时满足
}
口诀:范围判断拆两半,中间 && 来牵线。
易错 3

if 条件后面多写分号

if (x > 0); 末尾的分号让语句组变成了"空语句",后面的花括号块与 if 彻底脱钩,无论条件真假都会执行。

错误写法
if (x > 0); {
    cout << "正数";
}  // 恒输出
正确写法
if (x > 0) {
    cout << "正数";
}  // 真才输出
口诀:if 括号后面不加分号,分号一加判断白搞。
易错 4

switch 里忘记写 break

case 后面没有 break,程序会"穿透"到下一个 case 继续执行,把不该输出的内容也输出了。

错误写法
case 1: cout << "一";
case 2: cout << "二"; break;
// x=1 时输出"一二"
正确写法
case 1: cout << "一"; break;
case 2: cout << "二"; break;
// 各管各的
口诀:case 办事要出门,break 守门不能少;除非故意要共享,否则个个都加好。
易错 5

嵌套 if 中 else 配对错乱

else 永远与上面最近的、还没配对的 if 配对,与你想象的缩进无关。想让 else 跟外层配对,必须用花括号圈住内层。

易误解写法
if (a > 0)
    if (b > 0) cout << "双正";
else cout << "结束";
// else 跟内层 if 配对
括号明确写法
if (a > 0) {
    if (b > 0) cout << "双正";
} else {
    cout << "结束";
}
口诀:else 就近找 if,括号一圈不犯傻。
速查考前速查表
语法写法特点示例提醒
if 单分支if (条件) {...}真执行,假跳过if (x > 0) {...}条件必加括号
if-elseif (...) {...} else {...}二选一if (...) {...} else {...}else 不带条件
else if 多层if...else if...else自上而下,命中即停else if (x >= 80)顺序从严到宽
switchswitch (x) {case...break;}对号入座case 1: ...; break;别忘 break
关系运算符> < >= <= == !=结果为真或假x == 5== 比较,= 赋值
逻辑运算符&& || !并且 / 或者 / 不x > 0 && x < 10范围要拆两半
📌知识点速记卡
条件加括号

if (条件) 的括号一个不能少;括号里放的是能判断真假的表达式。

真执行假跳过

条件为真执行语句组,为假整段跳过,程序都会继续往下走。

else 不带条件

else 就是"否则",它不判断任何东西,只能紧跟在 if 后面。

自上而下命中即停

else if 从第一层开始判断,一旦命中就执行并停止,后面的档位全部免检。

else 就近配对

嵌套 if 中,else 与上面最近的未配对 if 结对;加花括号可消除一切歧义。

switch 别忘 break

每个 case 办完事要用 break 出门,否则会穿透到下一个 case 继续执行。

== 与 =

== 是比较(结果真假),= 是赋值(存值进变量),条件里一律写 ==。

范围拆两半

0 < x < 10 必须写成 x > 0 && x < 10,数学连写在 C++ 里不成立。

课后练习

练习作业

巩固 if、else if、switch 的判断逻辑与书写规范,分层练习,点击展开答案与解析。

总结练习3 道综合题
总结 1 判断题

题目:判断 —— 执行 if (x > 0) cout << "正数"; 时,如果 x 为 0,程序会输出"正数"。

提示:先算条件 0 > 0 的真假,再决定语句组是否执行。
点击查看参考答案
答案:错误。0 > 0 为假,if 的语句组被整段跳过,什么都不输出。单分支 if 只在条件成立时行动。
总结 2 写输出

题目:下面程序输出什么?

C++成绩评级追踪
int x = 75;
if (x >= 90) cout << "A";
else if (x >= 80) cout << "B";
else if (x >= 60) cout << "C";
else cout << "D";
点击查看参考答案
答案:C。75 >= 90 假,跳过;75 >= 80 假,跳过;75 >= 60 真,输出 C 并立即停止,else 不再执行。自上而下、命中即停。
总结 3 编程题

题目:读入一个整数,输出它的绝对值。

想一想:什么情况下数值需要"翻个面"?什么时候保持原样?

提示:负数的绝对值是它的相反数:if (n < 0) n = -n; 之后再输出。
点击查看参考答案
C++参考代码
#include <iostream>
using namespace std;
int main(){
    int n;
    cin >> n;
    if (n < 0) {
        n = -n;   // 负数翻面变正
    }
    cout << n << endl;
    return 0;
}
示例:输入 -6 → 输出 6;输入 8 → 输出 8。说明:这里用单分支就够了:只对负数动手,正数和 0 原样通过。
A 组基础巩固(4 题)
A1 填空题

题目:C++ 中判断两个值是否相等用 ______ 运算符,给变量赋值用 ______ 运算符;switch 根据 ______ 的值选择分支,每个分支用 ______ 加常量来标记。

点击查看参考答案
C++完整参考代码
// A1:== 判断相等、= 赋值,switch 用 case 标记分支
#include <iostream>
using namespace std;

int main()
{
    int score = 90;
    if (score == 90)                 // == 才是判断是否相等
        cout << "满分" << endl;

    int n = 1;                       // = 是把值赋给变量
    switch (n)                       // switch 按表达式的值选分支
    {
        case 1:  cout << "第一名" << endl; break;
        default: cout << "加油" << endl;
    }
    return 0;
}

答案:==;=;表达式(整数或字符型);case。

思路:判断相等用双等号 ==,赋值用单等号 =,两者长得像、职责完全不同;switch 括号里放一个表达式(常见是 int 或 char 型),每个分支用 case 常量: 标记。

考点:本讲「关系运算符 ==、赋值 = 与 switch-case 结构」。

易错:写成 if (a = b)——这是赋值不是判断,条件恒为真;case 后面写变量(如 case n:)会编译报错;忘记 break; 造成「穿透」,后面的分支被连带执行。

A2 判断题

题目:判断 —— else 可以单独使用,不需要配合 if。

点击查看参考答案
答案:错误。else 的含义是"否则",必须紧跟在 if(或 if-else if 链)后面使用,单独写 else 会直接编译报错。

考点:else 与 if 的配对规则——else 必须依附于一个 if 才能出现。

易错:认为 else 可以独立成句使用,结果编译时直接报错。

A3 写输出

题目:键盘输入 4,下面程序输出什么?

C++if 外的一句
int x;
cin >> x;
if (x % 2 == 1) cout << "奇数";
cout << "完毕";
点击查看参考答案
C++完整参考代码
// A3:题目原程序
#include <iostream>
using namespace std;

int main()
{
    int x;
    cin >> x;                        // 读入 4
    if (x % 2 == 1)
        cout << "奇数" << endl;      // 归 if 管:4 % 2 == 0,条件为假,跳过
    cout << "完毕" << endl;          // 不归 if 管:一定执行
    return 0;
}
// 输入:4
// 输出:完毕

答案:输出 完毕。

思路:输入 4,4 % 2 == 1 为假,if 管住的那句「奇数」被跳过;「完毕」写在 if 外面,不受条件影响,所以一定会打印。分清哪句归 if 管、哪句不归,是读分支代码的基本功。

考点:本讲「if 的作用范围」——不加花括号时,if 只管住紧跟的一条语句。

易错:以为会输出「奇数」或两行都输出。对照记忆:若改成 if (x % 2 == 1) { cout << "奇数"; cout << "完毕"; },输入 4 时两句都被跳过,屏幕什么也不输出。

A4 编程题

题目:读入一个整数,是正数输出"正数",是负数输出"负数",是 0 输出"零"。

提示:三种结果,用 if / else if / else 三层结构正好。
点击查看参考答案
C++参考代码
#include <iostream>
using namespace std;
int main(){
    int x;
    cin >> x;
    if (x > 0) {
        cout << "正数" << endl;
    } else if (x < 0) {
        cout << "负数" << endl;
    } else {
        cout << "零" << endl;
    }
    return 0;
}
说明:三个条件互斥(一个数不可能既正又负),用 else if 连起来,末尾 else 正好接住 0。

思路:正数、负数、零三种情况互斥,用 if / else if / else 依次覆盖即可。

易错:只写 if 和 else if 两条分支,x 等于 0 时什么都不输出。

B 组能力提高(4 题)
B1 写输出

题目:下面程序输出什么?

C++分号陷阱
int x = 8;
if (x > 10);
{
    cout << "大于10";
}
点击查看参考答案
C++完整参考代码
// B1:题目原程序,注意 if 后面那个不起眼的分号
#include <iostream>
using namespace std;

int main()
{
    int x = 8;
    if (x > 10);        // ← 分号让 if 的语句组变成空语句
    {
        cout << "大于10" << endl;   // 与 if 再无关系,无条件执行
    }
    return 0;
}
// 输出:大于10

答案:输出 大于10。

思路:if (x > 10); 末尾的分号让 if 的语句组变成了一条空语句,后面的花括号块成了独立代码块,与 if 无关,所以始终执行。8 并不大于 10,「大于10」却照样被打印。

考点:本讲「if 语句的分号陷阱」。

易错:以为条件不成立应该什么都不输出。对照记忆:去掉分号写成 if (x > 10) { cout << "大于10"; },则什么都不输出。写 if 时花括号前不要多打分号。

B2 推理题

题目:键盘输入 2,下面程序输出什么?

C++switch 穿透
int x;
cin >> x;
switch (x) {
    case 1: cout << "一";
    case 2: cout << "二";
    case 3: cout << "三"; break;
    default: cout << "其他";
}
点击查看参考答案
答案:二三。x 为 2,从 case 2 进入,输出"二";case 2 没有 break,程序穿透到 case 3 输出"三",遇到 break 才停止。default 被跳过。少一个 break,多一串输出。

考点:switch 的 case 穿透(fall-through)——分支末尾没有 break 就会继续往下执行。

易错:以为只输出「二」,忽略了 case 2 缺 break 会连带输出「三」。

B3 编程题

题目:简易计算器 —— 读入两个整数和一个运算符(+ - * /),输出运算结果。

运算符用 char 类型读入,用 switch 根据运算符选择算法。

点击查看参考答案
C++参考代码
#include <iostream>
using namespace std;
int main(){
    int a, b;
    char op;
    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;
    }
    return 0;
}
示例:输入 10 + 3 → 13;输入 10 / 3 → 3(整数除法只保留整数部分,第 2 讲学过的知识点在这里派上用场)。说明:case 后面可以跟字符常量,如 '+'、'-',switch 对字符型同样适用。

思路:用 switch 按运算符分派到四个分支,每个分支算出结果后立刻 break。

易错:分支末尾忘记写 break 会连续输出多个运算结果;除号用整数除法时结果被截断。

B4 写输出

题目:下面程序输出什么?

C++else 就近配对
int a = 5, b = 0;
if (a > 0)
    if (b > 0) cout << "双正";
else cout << "你好";
点击查看参考答案
C++完整参考代码
// B4:题目原程序,else 与最近的 if 配对
#include <iostream>
using namespace std;

int main()
{
    int a = 5, b = 0;
    if (a > 0)                     // 成立,进入内层判断
        if (b > 0)                 // b = 0,不成立
            cout << "双正" << endl;
        else
            cout << "你好" << endl; // 与最近的 if (b > 0) 配对
    return 0;
}
// 输出:你好

答案:输出 你好。

思路:a > 0 为真,进入内层判断;else 只看「最近原则」,和第 2 个 if(b > 0)配对,b = 0 使条件为假,于是执行 else 输出「你好」。

考点:本讲「if-else 的配对规则(就近原则)」与嵌套 if。

易错:被缩进骗到,以为 else 配的是外层 if (a > 0)。想让 else 归外层管,必须给内层加花括号:if (a > 0) { if (b > 0) cout << "双正"; } else cout << "你好";。

C 组思维挑战(4 题)
C1 挑战题

题目:读入三个整数,输出其中的最大值。要求只用嵌套 if,不用 &&、||。

思路:先比较 a 和 b 分出胜负,再让胜者与 c 对决。

点击查看参考答案
C++参考代码
#include <iostream>
using namespace std;
int main(){
    int a, b, c;
    cin >> a >> b >> c;
    if (a > b) {
        if (a > c) cout << a << endl;
        else cout << c << endl;
    } else {
        if (b > c) cout << b << endl;
        else cout << c << endl;
    }
    return 0;
}
示例:输入 5 9 2 → 9。说明:外层先分出 a、b 的胜者,内层让胜者与 c 比——两场比赛决出冠军。当然,用"默认值法"(总结提升里的解法二)写起来更短。

思路:先让其中两个数比出较大的一个,再拿它和第三个数比较,用嵌套 if 完成。

易错:相等的情形没考虑周全导致判断出错;嵌套层里 else 与哪个 if 配对看错。

C2 陷阱题

题目:想判断"x 大于 0 且小于 10",写成 if (0 < x < 10) 会有什么问题?

点击查看参考答案
答案:条件恒为真,判断完全失效。C++ 从左往右算:先算 0 < x,得到 true(1)或 false(0);再拿这个 1 或 0 与 10 比较,1 < 10 和 0 < 10 都成立,所以无论 x 是多少,条件都为真。正确写法:if (x > 0 && x < 10)。数学连写在 C++ 里必须拆成两半。

考点:关系运算符的结果是 bool(真为 1、假为 0),不能像数学那样把比较连写在一起。

易错:把 0 < x < 10 当成「x 在 0 和 10 之间」,其实这个条件恒为真。

C3 编程题

题目:月份天数查询 —— 读入月份 m(1~12),用 switch 输出该月天数(2 月按 28 天计)。

要求利用 case 共享,把 31 天的月份归为一组、30 天的归为一组。

点击查看参考答案
C++参考代码
#include <iostream>
using namespace std;
int main(){
    int m;
    cin >> m;
    switch (m) {
        case 1: case 3: case 5: case 7: case 8: case 10: case 12:
            cout << "31" << endl; break;
        case 4: case 6: case 9: case 11:
            cout << "30" << endl; break;
        case 2:
            cout << "28" << endl; break;
        default:
            cout << "输入错误" << endl;
    }
    return 0;
}
示例:输入 10 → 31;输入 2 → 28。说明:多个 case 连写、共用一段语句,是 switch 的"分组"绝活,12 个分支只需写 4 个出口。

思路:把天数相同的月份归到同一组 case,共用一段输出代码,最后只写一个 break。

易错:每组 case 末尾漏写 break 会穿透输出多个天数;或漏掉某个 31 天的月份。

C4 编程题

题目:出租车计费 —— 起步价 8 元(3 公里以内),超过 3 公里的部分每公里加收 2 元。读入公里数 x(整数),输出车费。

提示:先判断 x <= 3:是就收 8 元;不是就收 8 + (x - 3) * 2 元。
点击查看参考答案
C++参考代码
#include <iostream>
using namespace std;
int main(){
    int x, cost;
    cin >> x;
    if (x <= 3) {
        cost = 8;
    } else {
        cost = 8 + (x - 3) * 2;
    }
    cout << cost << endl;
    return 0;
}
示例:输入 2 → 8;输入 7 → 16(8 + 4 × 2 = 16)。说明:分段计费是分支结构的经典应用:先用 if-else 分出"段",再在每段里套用各自的计费公式。以后还会遇到三段、四段的版本,思路完全一样。

易错:忘记 3 公里以内只收起步价 8 元,写成 8 + x*2;超出部分要乘 (x - 3) 而不是 x。