一、本节学习定位
本节内容属于 流程控制 中的选择结构部分。C 语言中的选择结构主要包括两类:
-
if 语句
-
switch 语句
在实际入门学习中,if 语句 使用频率更高,也是学习流程控制的重点。switch 语句主要用于处理"表达式的值等于某些固定常量"的多分支问题,适合菜单选择、等级分类、命令分发等场景。
本节当前重点是继续深入掌握 if 语句 ,后续再系统学习 switch 语句。
二、选择结构的基本概念
选择结构用于根据条件选择不同的执行路径。
例如:
if (score >= 60)
{
printf("及格\n");
}
else
{
printf("不及格\n");
}
程序会先判断:
score >= 60
如果条件成立,则执行:
printf("及格\n");
否则执行:
printf("不及格\n");
这就是典型的二分支选择结构。
三、C语言中的两种选择语句
| 语句类型 | 主要用途 | 适用场景 | 学习重点 |
|---|---|---|---|
| if | 条件判断 | 范围判断、复杂逻辑判断、大小比较 | 当前重点 |
| switch | 多分支匹配 | 固定值匹配、菜单命令、等级字符判断 | 后续补充 |
四、if语句是选择结构的学习重点
1. if语句适用范围更广
if 语句可以判断任意表达式的真假,适合处理各种复杂条件。
例如成绩区间判断:
if (score >= 90 && score <= 100)
{
printf("优秀\n");
}
else if (score >= 80 && score < 90)
{
printf("良好\n");
}
else if (score >= 60 && score < 80)
{
printf("及格\n");
}
else
{
printf("不及格\n");
}
这里每一个条件都是一个逻辑表达式,因此使用 if...else if...else 更自然。
2. if语句可以处理范围判断
例如:
score >= 90 && score <= 100
表示:
score 大于等于 90,并且 score 小于等于 100
这种"范围判断"是 if 语句的典型应用场景。
3. if语句可以处理复杂逻辑
例如:
if (age >= 18 && score >= 60)
{
printf("符合条件\n");
}
该条件同时判断年龄和成绩,只有两个条件都成立时才执行输出语句。
五、switch语句的基本作用
switch 语句 用于实现多分支选择结构。它根据某个表达式的值,跳转到对应的 case 分支执行。
基本形式如下:
switch (表达式)
{
case 常量1:
语句1;
break;
case 常量2:
语句2;
break;
case 常量3:
语句3;
break;
default:
默认语句;
break;
}
其中:
| 关键字 | 含义 |
|---|---|
| switch | 根据表达式的值进行多分支选择 |
| case | 表示一个匹配入口 |
| break | 跳出 switch 结构 |
| default | 当前面所有 case 都不匹配时执行 |
六、switch语句示例:按等级输出分数段
1. 程序功能
从键盘输入一个成绩等级字符:
| 输入字符 | 输出分数段 |
|---|---|
A |
85~100 |
B |
70~84 |
C |
60~69 |
D |
<60 |
| 其他字符 | 输入错误 |
2. 示例程序
#include <stdio.h>
int main(void)
{
char grade;
printf("请输入成绩等级 A/B/C/D:");
scanf("%c", &grade);
printf("Your score: ");
switch (grade)
{
case 'A':
printf("85~100\n");
break;
case 'B':
printf("70~84\n");
break;
case 'C':
printf("60~69\n");
break;
case 'D':
printf("<60\n");
break;
default:
printf("enter data error!\n");
break;
}
return 0;
}
3. 程序讲解
| 代码 | 作用 |
|---|---|
char grade; |
定义字符变量,用于保存成绩等级 |
scanf("%c", &grade); |
从键盘输入一个字符 |
switch (grade) |
根据 grade 的值选择分支 |
case 'A': |
当 grade 等于 'A' 时执行 |
break; |
执行完当前分支后跳出 switch |
default: |
当前面所有 case 都不匹配时执行 |
七、switch语句的执行流程
以输入 A 为例:
输入:A
程序执行流程如下:
-
读取字符
'A',存入变量grade; -
执行
switch (grade); -
将
grade的值依次与各个case常量比较; -
找到匹配项:
case 'A':
-
执行:
printf("85~100\n");
-
遇到:
break;
-
跳出整个
switch结构。
最终输出:
Your score: 85~100
八、switch中的break非常重要
1. 正确写法
case 'A':
printf("85~100\n");
break;
break 的作用是终止当前 switch 结构,防止程序继续向下执行后面的 case 分支。
2. 缺少break的后果
如果省略 break:
switch (grade)
{
case 'A':
printf("85~100\n");
case 'B':
printf("70~84\n");
case 'C':
printf("60~69\n");
case 'D':
printf("<60\n");
default:
printf("enter data error!\n");
}
当输入 A 时,程序会从 case 'A' 开始一直向下执行,直到 switch 结束。
可能输出:
85~100
70~84
60~69
<60
enter data error!
这通常不是预期结果。
九、switch与if的区别
| 对比维度 | if语句 | switch语句 |
|---|---|---|
| 判断方式 | 判断表达式真假 | 匹配表达式的固定值 |
| 适合场景 | 范围判断、复杂条件 | 固定常量匹配 |
| 条件形式 | 可以是任意关系表达式或逻辑表达式 | 通常是整型或字符型表达式 |
| 分支数量 | 可多可少 | 适合多个固定分支 |
| 是否需要break | 不需要 | 通常每个 case 后需要 |
| 可读性 | 复杂多分支时可能冗长 | 固定值多分支时更清晰 |
十、什么时候用if,什么时候用switch
1. 适合使用if的情况
当条件是范围判断或复杂逻辑时,应优先使用 if。
例如:
if (score >= 90 && score <= 100)
{
printf("优秀\n");
}
这里判断的是一个区间,适合用 if。
2. 适合使用switch的情况
当判断对象是某个固定值时,可以使用 switch。
例如:
switch (grade)
{
case 'A':
printf("优秀\n");
break;
case 'B':
printf("良好\n");
break;
case 'C':
printf("及格\n");
break;
default:
printf("输入错误\n");
break;
}
这里判断的是字符 'A'、'B'、'C' 等固定值,适合用 switch。
十一、switch使用注意事项
-
switch后面的表达式通常应为 整型表达式 或 字符型表达式。 -
case后面必须是 常量 或 常量表达式,不能是变量或范围表达式。 -
每个
case常量不能重复。 -
default不是必须的,但建议保留,用于处理异常输入。 -
一般情况下,每个
case分支最后都应写break;。 -
如果故意省略
break;,应明确知道会发生"继续向下执行"的效果。 -
case只是入口标号,不是独立的条件判断。
十二、错误示例:不能用switch直接判断分数范围
以下写法是错误思路:
switch (score)
{
case score >= 90:
printf("优秀\n");
break;
}
原因是:
score >= 90
不是 case 所要求的固定常量。
如果要判断成绩范围,应使用 if...else if...else:
if (score >= 90 && score <= 100)
{
printf("优秀\n");
}
else if (score >= 80 && score < 90)
{
printf("良好\n");
}
else if (score >= 60 && score < 80)
{
printf("及格\n");
}
else
{
printf("不及格\n");
}
十三、VSCode中验证switch程序
1. 新建源文件
建议文件名:
switch_grade.c
2. 编写代码
将以下代码保存到文件中:
#include <stdio.h>
int main(void)
{
char grade;
printf("请输入成绩等级 A/B/C/D:");
scanf("%c", &grade);
switch (grade)
{
case 'A':
printf("85~100\n");
break;
case 'B':
printf("70~84\n");
break;
case 'C':
printf("60~69\n");
break;
case 'D':
printf("<60\n");
break;
default:
printf("enter data error!\n");
break;
}
return 0;
}
3. 编译程序
在 VSCode 终端中执行:
gcc switch_grade.c -o switch_grade.exe
如果想查看更多潜在警告,可以使用:
gcc -Wall switch_grade.c -o switch_grade.exe
4. 运行程序
./switch_grade.exe
5. 测试输入
| 输入 | 预期输出 |
|---|---|
A |
85~100 |
B |
70~84 |
C |
60~69 |
D |
<60 |
E |
enter data error! |
十四、本节要点总结
-
C 语言选择结构主要包括 if 和 switch。
-
当前学习重点是 if 语句,因为它适用范围更广。
-
switch 适合处理固定值匹配的多分支问题。
-
if 适合处理范围判断和复杂逻辑条件。
-
switch中的case只是入口标号,不是条件判断语句。 -
break用于跳出switch,一般不能省略。 -
default用于处理所有case都不匹配的情况。 -
判断成绩区间时,通常使用 if...else if...else ,不适合直接用
switch。 -
使用 VSCode 练习时,应通过不同输入观察程序分支执行结果。
十五、参考出处
-
《C程序设计(第五版)》谭浩强,第 3 章"最简单的 C 程序设计------顺序程序设计":C 语言控制语句分类,包含
if、switch、break等控制语句。 -
《C程序设计(第五版)》谭浩强,第 4 章"选择结构程序设计":
if语句与switch语句,多分支选择结构。 -
《C程序设计(第五版)》谭浩强,第 4.7 节"用 switch 语句实现多分支选择结构":
switch、case、default、break的使用方法。 -
郝斌《C语言自学入门教程》对应内容:选择结构中
if与switch的学习顺序和重点。 -
VSCode-C/C++ 环境配置实践:使用 GCC 编译、运行和测试 C 程序。