C语言中的switch语句



一个switch语句允许将一个变量与其值的列表进行比较。每个值称为一个case,并且正在切换的变量会针对每个switch case进行检查。

C语言switch-case语句

switch-case语句是C语言中的一个决策语句if-else语句提供了两个备选操作,而switch-case结构是一个多路分支语句。C语言中的switch语句通过将单个变量与其多个值进行比较,根据匹配情况执行特定代码来简化多路选择。它允许将变量与其值的列表进行比较。

switch-case语句的语法

程序的流程可以将行执行切换到满足给定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;
}

switch-case语句如何工作?

switch关键字前面的括号包含一个表达式。该表达式应计算为整数或字符。在括号后面的花括号内,表达式的不同可能值形成case标签。

case标签前面的冒号(:)前的一个或多个语句形成一个代码块,当表达式等于标签的值时执行该代码块。

你可以将switch-case字面翻译为“如果表达式等于value1,则执行block1”,依此类推。

C语言会将表达式与每个标签值进行比较,并执行第一个匹配项前面的代码块。每个case代码块的最后一个语句都是一个breakbreak语句将控制权移出switch结构的范围。

你还可以将default case定义为switch结构中的最后一个选项。当表达式与任何先前的case值都不匹配时,执行default case代码块。

switch-case语句的流程图

表示C语言中switch-case结构的流程图如下所示:

switch statement in C

使用switch-case语句的规则

以下规则适用于switch语句:

  • switch语句中使用的表达式必须具有整型或枚举类型,或者属于一个类类型,其中该类具有一个到整型或枚举类型的单一转换函数。

  • 你可以在一个switch中拥有任意数量的case语句。每个case后面跟着要比较的值和一个冒号。

  • case的常量表达式必须与switch中的变量具有相同的数据类型,并且必须是常量字面量

  • 当正在切换的变量等于某个case时,该case后面的语句将执行,直到遇到break语句。

  • 遇到break语句时,switch将终止,并且控制流跳转到switch语句后面的下一行。

  • 并非每个case都需要包含break。如果没有出现break,控制流将贯穿到后续的case,直到遇到break为止。

  • switch语句可以有一个可选的default case,它必须出现在switch的末尾。default case可用于在没有case为真时执行任务。default case不需要break。

switch-case语句作为级联if-else语句的简洁替代方案,尤其是在“if”中的布尔表达式基于“=”运算符时。

如果if(或else)代码块中有多个语句,则必须将它们放在花括号内。因此,如果你的代码有许多ifelse语句,则带有许多花括号开合的代码看起来很笨拙。switch-case替代方案是一种简洁且整洁的解决方案。

C语言switch-case语句示例

练习以下示例以学习C编程语言中的switch case语句:

示例1

在以下代码中,一系列if-else语句根据“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的使用非常重要。每个case对应的语句块都以break语句结束。如果没有使用break语句会怎样?

switch-case的工作方式如下:当程序进入switch结构时,它开始将切换表达式的值与case进行比较,并执行第一个匹配项的代码块。break导致控制权移出switch范围。如果找不到break,则后续的代码块也会执行,从而导致结果不正确。

示例2:不使用Break的Switch语句

让我们注释掉上面代码中的所有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;
}

输出

你期望打印“Good Morning”消息,但发现打印了所有三条消息!

Time code: a

Good Afternoon
Good Evening
Good Morning

这是因为在没有break语句的情况下,C语言会贯穿后续的case代码块。

示例3:使用Switch语句的成绩检查程序

在下面的程序中,“grade”是切换变量。对于不同等级的case,将打印相应的反馈消息。

#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”变量)的值并检查输出。

示例4:使用Switch进行算术运算的基于菜单的计算器

以下示例显示了一个算术运算的菜单。根据运算符代码(1、2、3或4)的值,执行两个值的加法、减法、乘法或除法。如果运算符代码是其他值,则执行default case。

#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

通过组合多个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\n", ch);
}

你还可以使用省略号(…)来组合表达式的值范围。例如,要将切换变量的值与1到10之间的任何数字匹配,可以使用“case 1 … 10”

示例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

示例2

以下程序检查给定char变量的值是否存储小写字母、大写字母、数字或任何其他键。

#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”的不同值测试代码输出。

c_decision_making.htm
广告