一、本节学习定位
本节内容属于流程控制中的选择结构部分。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.c2. 编写代码
将以下代码保存到文件中:
#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.exe4. 运行程序
./switch_grade.exe5. 测试输入
| 输入 | 预期输出 |
|---|---|
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 程序。