C 语言中的 Switch 语句
switch 语句 允许测试变量是否与一系列值相等。每个值称为一个 case,并且会针对每个 switch case 检查被选中的变量。
C switch-case 语句
switch-case 语句是 C 语言中的决策语句。if-else 语句提供两种可选操作,而 switch-case 结构是多路分支语句。C 语言中的 switch 语句通过根据多个值评估单个变量,并根据匹配结果执行特定代码,从而简化了多路选择。它允许测试变量与一系列值是否相等。
switch-case 语句的语法
程序流程可以将代码行切换到满足给定条件的分支。switch-case 结构用法的示意图如下:
switch (Expression){ // 如果 expr 等于 Value1 case Value1: Statement1; Statement2; break; // 如果 expr 等于 Value2 case Value2: Statement1; Statement2; break; . . // 如果 expr 与上述特定值不同 default: Statement1; Statement2; }
switch-case 语句如何工作?
switch 关键字前面的括号包含一个表达式。该表达式的计算结果应为整数或字符。括号后的花括号内,表达式的不同可能值构成了 case 标签。
case 标签前面的冒号 (:) 后面的一个或多个语句构成一个代码块,当表达式等于标签的值时执行。
您可以将 switch-case 直译为"如果表达式等于值 1,则执行代码块 1",依此类推。
C 语言会使用每个标签值检查表达式,并执行第一个匹配项前面的代码块。每个 case 代码块的最后一个语句都是 break。 break 语句将控制权移出 switch 结构的范围。
您还可以将 default case 定义为 switch 结构中的最后一个选项。当表达式与任何先前的 case 值都不匹配时,将执行默认的 case 块。
switch-case 语句流程图
C 语言中表示 switch-case 结构的流程图如下 -

switch-case 语句使用规则
以下规则适用于 switch 语句 -
switch 语句中使用的表达式必须是整型或枚举型,或者是类类型,并且该类具有一个到整型或枚举型的转换函数。
一个 switch 语句中可以包含任意数量的 case 语句。每个 case 后面都跟着要比较的值和一个冒号。
当被 switch 的变量等于某个 case 时,该 case 后面的语句将执行,直到遇到 break 语句。
遇到 break 语句时,switch 终止,控制流跳转到 switch 语句之后的下一行。
并非每个 case 都需要包含 break。如果没有出现 break,控制流将直接跳转到后续的 case,直到遇到 break。
switch 语句可以包含一个可选的 default case,该 case 必须出现在 switch 语句的末尾。default case 可用于在所有 case 都不为真时执行任务。default case 中无需 break。
switch-case 语句 可以作为 if-else 语句级联的紧凑替代方案,尤其是在"if"中的布尔表达式基于"="运算符时。
如果 if(或 else)块中有多个语句,则必须将它们放在花括号内。因此,如果您的代码包含许多 if 和 else 语句,那么包含如此多左右花括号的代码会显得笨拙。 switch-case 替代方案是一种紧凑且简洁的解决方案。
C switch-case 语句示例
练习以下示例,学习 C 编程语言中的 switch case 语句 -
示例 1
在下面的代码中,一系列 if-else 语句 根据"ch"变量的值("m"、"a"或"e"分别代表上午、下午或晚上)打印三条不同的问候消息。
#include <stdio.h> int main(){ /* 局部变量定义 */ char ch = 'e'; printf("Time code: %c ", ch); if (ch == 'm') printf("Good Morning"); else if (ch == 'a') printf("Good Afternoon"); else printf("Good Evening"); return 0; }
上述代码中的 if-else 逻辑被以下代码中的 switch-case 结构取代 -
#include <stdio.h> int main (){ // 局部变量定义 char ch = 'm'; printf("Time code: %c ", ch); switch (ch){ case 'a': printf("Good Afternoon "); break; case 'e': printf("Good Evening "); break; case 'm': printf("Good Morning "); } return 0; }
输出
更改"ch"变量的值并检查输出。对于 ch = 'm',我们得到以下输出 -
Time code: m Good Morning
此处 break 的使用非常重要。每个 case 对应的语句块都以 break 语句结尾。如果不使用 break 语句会怎样?
switch-case 的工作原理如下:当程序进入 switch 结构时,它开始将 switch 表达式的值与 case 进行比较,并执行第一个匹配的语句块。break 会导致控制超出 switch 作用域。如果未找到 break,后续语句块也会被执行,从而导致错误的结果。
示例 2:不使用 Break 的 Switch 语句
让我们注释掉上述代码中的所有 break 语句。
#include <stdio.h> int main (){ /* 局部变量定义 */ char ch = 'a'; printf("Time code: %c ", ch); switch (ch){ case 'a': printf("Good Afternoon "); // break; case 'e': printf("Good Evening "); // break; case 'm': printf("Good Morning "); } return 0; }
输出
您希望打印"Good Morning"消息,但您发现这三条消息都被打印出来!
Time code: a Good Afternoon Good Evening Good Morning
这是因为,如果后续 case 块末尾没有 break 语句,C 会跳过这些 case 块。
示例 3:使用 Switch 语句的成绩检查程序
在下面的程序中,"grade"是切换变量。对于不同的成绩 case,将打印相应的结果消息。
#include <stdio.h> int main(){ /* 局部变量定义 */ char grade = 'B'; switch(grade){ case 'A' : printf("Outstanding! " ); break; case 'B': printf("Excellent! "); break; case 'C': printf("Well Done " ); break; case 'D': printf("You passed " ); break; case 'F': printf("Better try again " ); break; default : printf("Invalid grade " ); } printf("Your grade is %c ", grade); return 0; }
输出
运行代码并检查其输出 −
Excellent! Your grade is B
现在更改"grade"的值(它是一个"char"变量)并检查输出。
示例 4:使用 Switch 进行算术运算的菜单式计算器
以下示例显示一个算术运算菜单。根据运算符代码(1、2、3 或 4)的值,对两个值进行加、减、乘或除运算。如果运算符代码为其他值,则执行默认情况。
#include <stdio.h> int main (){ // 局部变量定义 int a = 10, b = 5; // 使用其他值 2、3、4、5 运行程序 int op = 1; float result; printf("1: addition "); printf("2: subtraction "); printf("3: multiplication "); printf("4: division "); printf(" a: %d b: %d : op: %d ", a, b, op); switch (op){ case 1: result = a + b; break; case 2: result = a - b; break; case 3: result = a * b; break; case 4: result = a / b; break; default: printf("Invalid operation "); } if (op >= 1 && op <= 4) printf("Result: %6.2f", result); return 0; }
输出
1: addition 2: subtraction 3: multiplication 4: division a: 10 b: 5 : op: 1 Result: 15.00
对于"op"的其他值(2、3 和 4),您将获得以下输出 -
a: 10 b: 5 : op: 2 Result: 5.00 a: 10 b: 5 : op: 3 Result: 50.00 a: 10 b: 5 : op: 4 Result: 2.00 a: 10 b: 5 : op: 5 Invalid operation
组合多个 case 的 switch 语句
可以将多个 case 组合在一起执行一个代码块。当其中任何一个 case 值匹配时,组合 case 的主体就会执行。如果遇到同一个代码块需要对一个表达式的多个 case 标签执行的情况,可以将两个 case 上下叠加,从而组合它们,如下所示 -
语法
switch (exp) { case 1: case 2: statements; break; case 3: statements; break; default: printf("%c is a non-alphanumeric character ", ch); }
您还可以使用省略号 () 来组合表达式中的一系列值。例如,要将切换变量的值与 1 到 10 之间的任意数字匹配,可以使用"case 1 10"
示例 1
#include <stdio.h> int main (){ // 局部变量定义 int number = 5; switch (number){ case 1 ... 10: printf("The number is between 1 and 10 "); break; default: printf("The number is not between 1 and 10 "); } return 0; }
输出
运行代码并检查其输出。对于"number = 5",我们得到以下输出 -
The number is between 1 and 10
示例 2
以下程序检查给定 char 变量的值是否存储了小写字母、大写字母、数字或其他键。
#include <stdio.h> int main (){ char ch = 'g'; switch (ch){ case 'a' ... 'z': printf("%c is a lowercase alphabet ", ch); break; case 'A' ... 'Z': printf("%c is an uppercase alphabet ", ch); break; case 48 ... 57: printf("%c is a digit ", ch); break; default: printf("%c is a non-alphanumeric character ", ch); } return 0; }
输出
对于ch = 'g',我们得到以下输出 -
g is a lowercase alphabet
使用不同的"ch"值测试代码输出。