C语言小课堂:switch

C语言小课堂:switch
TANG JIAMEI我们今天来一起学习C语言中的 switch
语句。
- 什么是
switch
语句?
在C语言中, switch
语句是一种多分支选择语句,它允许程序根据一个表达式的值,从多个代码块中选择一个来执行。它提供了一种比使用多个 if-else if-else
语句更简洁、更清晰的方式来处理复杂的条件判断,特别是当你有多个可能的值需要判断时。
switch
语句的基本结构如下:
switch (expression) {
case constant_expression_1:
// 当 expression 的值等于 constant_expression_1 时执行的代码
break; // break 语句用于跳出 switch 结构
case constant_expression_2:
// 当 expression 的值等于 constant_expression_2 时执行的代码
break;
// ... 可以有任意数量的 case 分支
default:
// 当 expression 的值与所有 case 都不匹配时执行的代码(可选)
break; // 默认分支中的 break 也是可选的,因为已经是最后一个分支了
}
expression
:这是一个整型表达式(可以是 int
, char
, enum
等类型,但不能是 float
或 double
)。 switch
语句会计算这个表达式的值。
case constant_expression
:case
关键字后面跟着一个 常量表达式 (必须是常量,不能是变量或范围)。当 expression
的值与某个 case
后面的 constant_expression
相等时,对应的 case
代码块就会被执行。
break
语句 : 这是 switch
语句中至关重要的一部分!break
语句用于 跳出 switch
结构 。如果没有 break
,程序会继续执行下一个 case
的代码,直到遇到 break
或 switch
结束,这被称为“ 穿透”(fall-through)。
default
关键字 :这是一个可选的关键字,用于处理 expression
的值与所有 case
都不匹配的情况。如果 default
存在,并且没有 case
匹配成功,那么 default
后面的代码块就会被执行。default
可以放在 switch
块内的任何位置,但通常放在最后。
- 何时使用
switch
语句?
当你需要根据一个变量或表达式的特定、离散的整型值来执行不同的操作时,switch
语句是理想的选择。
什么时候用?
当你有多个选项或状态需要根据一个特定的值进行分发时。
例如,根据用户输入的菜单选项执行不同功能。
根据星期几显示不同的日程。
处理状态机的不同状态转换。
为什么用?
代码可读性更高:相比于长串的 if-else if-else
结构,switch
语句在处理多重等值判断时,逻辑结构更清晰,更易于理解和维护。
执行效率可能更高:在某些情况下,编译器可能会优化 switch
语句,使其比一系列 if-else if
链更高效,尤其是在 case
分支数量很多时。
避免“嵌套地狱”:可以有效避免多层 if-else
嵌套带来的复杂性和可读性下降。
和关联知识点的联系和区别(if-else if-else
) :
如果你的判断基于一个变量的特定值,并且这些值是离散的整型或字符型,那么 switch
是更好的选择。
如果你的判断涉及范围、不等式、浮点数比较或复杂的逻辑组合,那么 if-else if-else
是唯一或更合适的选择。
if-else if-else
:更通用,可以处理任何类型的条件(包括范围、逻辑组合等),灵活性更高。
switch
:专门用于处理基于单个整型表达式的等值判断。它不能直接处理浮点数,也不能直接处理复杂的逻辑条件(如 x > 10
或 y == 'A' && z < 5
)。
选择依据:
如果你的判断基于一个变量的特定值,并且这些值是离散的整型或字符型,那么 switch
是更好的选择。
如果你的判断涉及范围、不等式、浮点数比较或复杂的逻辑组合,那么 if-else if-else
是唯一或更合适的选择。
在编程学习中的地位和作用:
switch
语句是C语言中控制流的重要组成部分,与 if-else
、循环语句( for
, while
)共同构成了程序的基本执行骨架。
掌握 switch
能够让你编写出更结构化、更高效、更易读的代码,是初学者必须熟练掌握的技能。
- 怎么使用
switch
语句?
下面通过几个实际编程场景的例子来演示 switch
语句的用法。
示例一:简易菜单选择器
1 |
|
解释: 这个例子根据用户输入的整数 choice
来执行不同的操作。如果输入1,执行加法;输入2,执行减法,以此类推。如果输入1-4之外的数字,default
分支会处理无效输入。每个 case
后面的 break
确保了在执行完当前分支后,程序会跳出 switch
语句。
示例二:字符判断
switch
语句也可以用于字符类型,因为字符在C语言中本质上也是整型(ASCII码)。
1 |
|
解释: 这里根据输入的字符 grade
来判断成绩等级。case 'A':
等价于 case 65:
(因为字符 ‘A’ 的ASCII码是65)。
示例三:“穿透”(Fall-through)的利用
虽然通常我们使用 break
来防止穿透,但有时穿透是故意的,可以用来执行多个 case
共享的代码。
1 |
|
解释: 在这个例子中,多个 case
(如 case 1: case 3: ...
)后面没有 break
,这使得它们会“穿透”到下一个有 break
的 case
或者 default
。这样,对于所有有31天的月份,它们都共享同一行 printf("31");
代码,避免了代码重复。
💻 配套习题
第一题 (选择题)
以下关于C语言 switch
语句的描述,哪一项是不正确的?
A. switch
语句中的 expression
可以是 int
或 char
类型。
B. case
后面的 constant_expression
必须是常量。
C. 如果 switch
语句中没有 break
语句,程序会继续执行下一个 case
的代码。
D. switch
语句能够直接判断浮点数(如 double
类型)的大小范围。
第二题 (填空题)
在C语言的 switch
语句中,如果某个 case
分支的代码执行完毕后,没有遇到 break
语句,程序会继续执行下一个 case
分支的代码,这种现象被称为 ______。
第三题 (代码输出题)
阅读下面的C代码,并写出其输出结果:
#include <stdio.h>
int main() {
int x = 2;
switch (x) {
case 1:
printf("One\n");
case 2:
printf("Two\n");
case 3:
printf("Three\n");
default:
printf("Other\n");
}
return 0;
}
第四题 (概念辨析题)
判断题: default
关键字在 switch
语句中是必须的,否则程序会报错。
A. 正确
B. 错误
第五题 (编程题)
编写一个C程序,模拟一个简单的交通灯系统。程序接收一个字符输入,代表交通灯的颜色(’R’ 代表红灯,’Y’ 代表黄灯,’G’ 代表绿灯)。使用 switch
语句根据输入的颜色输出对应的提示信息:
‘R’:输出 “Stop! Red light.”
‘Y’:输出 “Caution! Yellow light.”
‘G’:输出 “Go! Green light.”
其他输入:输出 “Invalid light color.”
💡 习题讲解
第一题解析
答案:D
A. switch
语句中的 expression
可以是 int
或 char
类型。
正确。 switch
语句的表达式必须是整型,int
和 char
都属于整型家族(char
实际上存储的是字符的ASCII码,是整数)。
B. case
后面的 constant_expression
必须是常量。
正确。 case
标签后面只能跟常量值(字面量或用 const
定义的常量),不能是变量。
C. 如果 switch
语句中没有 break
语句,程序会继续执行下一个 case
的代码。
正确。这就是 switch
的“穿透”特性。当一个 case
匹配成功后,如果没有 break
,程序会继续执行其后的所有 case
(包括 default
)的代码,直到遇到 break
或 switch
语句结束。
D. switch
语句能够直接判断浮点数(如 double
类型)的大小范围。
不正确。 switch
语句的 expression
必须是整型表达式,不能是 float
或 double
类型。它也无法直接判断大小范围(如 > 10
或 < 5
),只能进行精确的等值匹配。判断浮点数范围或不等式通常需要使用 if-else if-else
结构。
第二题解析
答案: 穿透 (或 fall-through)
讲解: 这是一个关键概念。switch
语句的执行机制是,一旦找到匹配的 case
,它会从该 case
开始执行,直到遇到 break
语句或 switch
语句的末尾。如果没有 break
,控制流会“穿透”到下一个 case
,执行其代码,以此类推。理解这一点对于避免逻辑错误和有时故意利用这一特性(如多个 case
共享代码)非常重要。
第三题解析
答案:
Two
Three
Other
讲解:
程序开始, int x = 2;
。
switch (x)
: x
的值为 2
。
程序查找匹配的 case
。case 1:
不匹配。
case 2:
匹配成功。程序开始执行 printf("Two\n");
,输出 “Two”。
case 2:
后面 没有 break
语句。因此,程序会继续“穿透”到 case 3:
。
执行 printf("Three\n");
,输出 “Three”。
case 3:
后面 没有 break
语句。程序会继续“穿透”到 default:
。
执行 printf("Other\n");
,输出 “Other”。
default:
后面虽然也没有 break
,但它是 switch
的最后一个分支,所以 switch
语句在此结束。
程序返回 0
,结束。 这个题目很好地考察了对 switch
语句中 break
作用的理解。
第四题解析
答案: B (错误)
讲解: default
关键字是可选的。它的作用是当 switch
表达式的值与所有 case
标签的值都不匹配时,提供一个备选的执行路径。如果 default
不存在,并且没有 case
匹配成功,那么 switch
语句将不执行任何代码,直接跳过。程序不会因此报错。
第五题解析
答案: 见下方代码及讲解
1 |
|
讲解:
包含头文件:#include <stdio.h>
是必需的,因为它包含了 printf
和 scanf
函数的声明。
声明变量:char light_color;
声明一个字符变量来存储用户输入的颜色。
获取用户输入:
printf("请输入交通灯颜色 (R/Y/G): ");
提示用户输入。
scanf(" %c", &light_color);
读取用户输入的字符。注意 %c
前面的空格,这是一个小技巧,用于吸收之前输入操作可能留下的换行符,防止它被 scanf
误读为当前的字符输入。
使用 switch
语句 :
switch (light_color)
:根据 light_color
的值进行判断。
case 'R':
:当 light_color
是字符 ‘R’ 时,执行此分支。printf("Stop! Red light.\n");
输出对应的提示。
break;
:非常重要,确保在执行完当前 case
后跳出 switch
语句,避免“穿透”到其他 case
。
case 'Y':
和 case 'G':
类似处理。
default:
:如果 light_color
不匹配 ‘R’, ‘Y’, ‘G’ 中的任何一个,则执行 default
分支,输出 “Invalid light color.”。 这个编程题考察了 switch
语句的基本结构、字符类型的使用以及 break
语句的正确应用。