Cprogramming 简明教程

Switch Statement in C

一个 switch statement 允许变量根据一个值列表进行相等性测试。每个值称为一个 case ,而正在进行 switch 的变量会针对每个 switch case 进行检查。

C switch-case Statement

switch-case 语句是 C 中的 decision-making statementif-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 块。

Flowchart of switch-case Statement

表示 C 中的 switch-case 构造的流程图如下 −

switch statement

Rules for Using the switch-case Statement

以下规则适用于 switch 语句 −

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

  2. 你可以在 switch 内有任意数量的 case 语句。每个 case 之后都紧跟着要比较的值和一个冒号。

  3. case 的常量表达式必须与 switch 中的变量的数据类型相同,并且必须是一个 constant 或一个 literal

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

  5. 当到达 break 语句时,switch 终止,并且控制流跳到 switch 语句后面的下一行。

  6. 并非每个 case 都需要包含 break。如果没有 break,控制流会一直向下到后续 case,直到遇到一个 break 为止。

  7. switch 语句可以包含一个可选的 default case,它必须出现在 switch 的末尾。default case 可用于在所有 case 都为假时执行任务。default case 中不需要 break。

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

如果 if (或 else )块中有多个语句,则你必须将它们放在花括号内。因此,如果你的代码有很多 ifelse 语句,则具有那么多开闭花括号的代码看起来很笨拙。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”值测试代码输出。