Cprogramming 简明教程
Switch Statement in C
一个 switch statement 允许变量根据一个值列表进行相等性测试。每个值称为一个 case ,而正在进行 switch 的变量会针对每个 switch case 进行检查。
C switch-case Statement
switch-case 语句是 C 中的 decision-making statement 。 if-else 语句提供两个要执行的备用动作,而 switch-case 构造是一个多路分支语句。C 中的 switch 语句通过针对多个值评估单个变量并根据匹配执行特定代码,来简化多路选择。它允许对一个 variable 进行相等性测试,以针对一个值列表进行相等性测试。
Syntax of switch-case Statement
程序的流程可以将行执行转换为满足给定 case 的分支。switch-case 构造的示意图表示如下 −
switch (Expression){
// if expr equals Value1
case Value1:
Statement1;
Statement2;
break;
// if expr equals Value2
case Value2:
Statement1;
Statement2;
break;
.
.
// if expr is other than the specific values above
default:
Statement1;
Statement2;
}
How switch-case Statement Work?
switch 关键字前面的括号包含一个表达式。该表达式应计算为一个整数或一个字符。在括号后的花括号中,表达式的不同可能值会形成 case 标签。
在 case 标签前面的冒号 (:) 后的一个或多个语句形成一个块,当表达式等于标签值时将执行该块。
你可以将 switch-case 从字面上翻译为“如果表达式等于 value1,则执行 block1”,等等。
C 会使用每个标签值检查表达式,并执行第一个匹配前面的块。每个 case 块都有一个 break 作为最后一个语句。 break statement 会将控制权带出 switch 构造的范围。
你还可以将 default case 定义为 switch 构造中的最后一个选项。当表达式与任何较早的 case 值都不匹配时,将执行 default case 块。
Rules for Using the switch-case Statement
以下规则适用于 switch 语句 −
-
switch 语句中使用的表达式必须具有一个整数或枚举类型,或者属于一个类类型(其中类具有到一个整数或枚举类型的单一转换函数)。
-
你可以在 switch 内有任意数量的 case 语句。每个 case 之后都紧跟着要比较的值和一个冒号。
-
case 的常量表达式必须与 switch 中的变量的数据类型相同,并且必须是一个 constant 或一个 literal 。
-
当正在切换的变量等于某个 case 时,将执行该 case 后面的语句,直到到达 break 语句。
-
当到达 break 语句时,switch 终止,并且控制流跳到 switch 语句后面的下一行。
-
并非每个 case 都需要包含 break。如果没有 break,控制流会一直向下到后续 case,直到遇到一个 break 为止。
-
switch 语句可以包含一个可选的 default case,它必须出现在 switch 的末尾。default case 可用于在所有 case 都为假时执行任务。default case 中不需要 break。
switch-case statement 充当 if-else 语句级联的简洁替代方案,尤其是在“if”中的布尔表达式基于“=”运算符时。
如果 if (或 else )块中有多个语句,则你必须将它们放在花括号内。因此,如果你的代码有很多 if 和 else 语句,则具有那么多开闭花括号的代码看起来很笨拙。switch-case 替代方案是一个简洁且无杂乱的解决方案。
C switch-case Statement Examples
练习以下示例以了解 C 编程语言中的 switch case 语句 −
Example 1
在下面的代码中,一系列 if-else statements 根据“ch”变量的值(“m”、“a”或“e”,分别代表早上、下午或晚上)打印三个不同的问候消息。
#include <stdio.h>
int main(){
/* local variable definition */
char ch = 'e';
printf("Time code: %c\n\n", 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 (){
// local variable definition
char ch = 'm';
printf("Time code: %c\n\n", ch);
switch (ch){
case 'a':
printf("Good Afternoon\n");
break;
case 'e':
printf("Good Evening\n");
break;
case 'm':
printf("Good Morning\n");
}
return 0;
}
更改“ch”变量的值并检查输出。对于 ch = 'm',我们得到以下输出 −
Time code: m
Good Morning
这里使用 break 非常重要。每个情况对应的语句块以 break 语句结束。如果 break 语句没有使用,会怎样?
switch-case 的工作原理如下:当程序进入 switch 结构时,它开始将转换表达式的值与情况进行比较,并执行其第一个匹配的块。 break 导致控制脱离 switch 范围。如果未找到 break ,后续块也将被执行,从而导致结果不正确。
Example 2: Switch Statement without using Break
让我们注释掉上面代码中的所有 break 语句。
#include <stdio.h>
int main (){
/* local variable definition */
char ch = 'a';
printf("Time code: %c\n\n", ch);
switch (ch){
case 'a':
printf("Good Afternoon\n");
// break;
case 'e':
printf("Good Evening\n");
// break;
case 'm':
printf("Good Morning\n");
}
return 0;
}
你希望打印“早上好”的消息,但是你发现所有三条消息都打印出来了!
Time code: a
Good Afternoon
Good Evening
Good Morning
这是因为 C 在块的结尾没有 break 语句时,会贯穿后续的情况块。
Example 3: Grade Checker Program using Switch Statement
在下面的程序中,“grade”是转换变量。对于不同等级的情况,将打印相应的成绩消息。
#include <stdio.h>
int main(){
/* local variable definition */
char grade = 'B';
switch(grade){
case 'A' :
printf("Outstanding!\n" );
break;
case 'B':
printf("Excellent!\n");
break;
case 'C':
printf("Well Done\n" );
break;
case 'D':
printf("You passed\n" );
break;
case 'F':
printf("Better try again\n" );
break;
default :
printf("Invalid grade\n" );
}
printf("Your grade is %c\n", grade);
return 0;
}
运行代码并检查其输出:
Excellent!
Your grade is B
现在更改“grade”的值(它是“char”变量)并检查输出。
Example 4: Menu-based Calculator for Arithmetic Operations using Switch
以下示例显示了一个用于算术运算的菜单。根据运算符代码的值(1、2、3 或 4),对两个值进行加法、减法、乘法或除法。如果运算符代码是其他内容,则执行默认情况。
#include <stdio.h>
int main (){
// local variable definition
int a = 10, b = 5;
// Run the program with other values 2, 3, 4, 5
int op = 1;
float result;
printf("1: addition\n");
printf("2: subtraction\n");
printf("3: multiplication\n");
printf("4: division\n");
printf("\na: %d b: %d : op: %d\n", 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\n");
}
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
Switch Statement by Combining Multiple Cases
可以将多个情况一起编写以执行一个代码块。当其中任何一个值匹配时,这些组合情况的主体将执行。如果您遇到这种情况,其中同一代码块要针对表达式的多个情况标签执行,您可以通过将两个情况一个放在另一个的下方来合并它们,如下所示 −
Syntax
switch (exp) {
case 1:
case 2:
statements;
break;
case 3:
statements;
break;
default:
printf("%c is a non-alphanumeric character\n", ch);
}
您还可以使用省略号 (…) 来合并表达式的一系列值。例如,若要将转换变量的值与 1 到 10 之间的任何数字匹配,可以使用“case 1 … 10”
Example 1
#include <stdio.h>
int main (){
// local variable definition
int number = 5;
switch (number){
case 1 ... 10:
printf("The number is between 1 and 10\n");
break;
default:
printf("The number is not between 1 and 10\n");
}
return 0;
}
运行代码并检查其输出。对于“number = 5”,我们得到以下输出 −
The number is between 1 and 10
Example 2
下面的程序检查给定的字符变量的值是否存储了小写字母、大写字母、数字或任何其他键。
#include <stdio.h>
int main (){
char ch = 'g';
switch (ch){
case 'a' ... 'z':
printf("%c is a lowercase alphabet\n", ch);
break;
case 'A' ... 'Z':
printf("%c is an uppercase alphabet\n", ch);
break;
case 48 ... 57:
printf("%c is a digit\n", ch);
break;
default:
printf("%c is a non-alphanumeric character\n", ch);
}
return 0;
}
对于 ch = 'g' ,我们得到以下输出 −
g is a lowercase alphabet
使用不同的“ch”值测试代码输出。