C 语言编程教程

C 语言首页

C 语言基础

C 语言概述 C 语言特性 C 语言发展历史 C 语言下载安装和环境配置 C 语言程序结构 C 语言 Hello World C 编译过程 C 注释 C 标记 C 关键字 C 标识符 C 用户输入 C 基本语法 C 数据类型 C 变量 C 整数提升 C 类型转换 C 类型转换 C 布尔值

C 语言中的常量和文字

C 常量 C 字面量 C 转义序列 C 格式说明符

C 语言中的运算符

C 运算符 C 算术运算符 C 关系运算符 C 逻辑运算符 C 位运算符 C 赋值运算符 C 一元运算符 C 递增和递减运算符 C 三元运算符 C sizeof 运算符 C 运算符优先级 C 其他运算符

C 语言中的决策

C 决策 C if 语句 C if...else 语句 C 嵌套 if 语句 C switch 语句 C 嵌套 switch 语句

C 语言中的循环

C 循环 C While 循环 C For 循环 C Do...while 循环 C 嵌套循环 C 无限循环 C Break 语句 C Continue 语句 C goto 语句

C 语言中的函数

C 函数 C Main 函数 C 按值调用函数 C 按引用调用函数 C 嵌套函数 C 可变参数函数 C 用户定义函数 C 回调函数 C return 语句 C 递归

C 语言中的作用域规则

C 作用域规则 C 静态变量 C 全局变量

C 语言中的数组

C 数组 C 数组的属性 C 多维数组 C 将数组传递给函数 C 从函数返回数组 C 可变长度数组

C 语言中的指针

C 指针 C 指针和数组 C 指针的应用 C 指针运算 C 指针数组 C 指向指针的指针 C 将指针传递给函数 C 从函数返回指针 C 函数指针 C 指向数组的指针 C 指向结构体的指针 C 指针链 C 指针 vs 数组 C 字符指针和函数 C NULL 指针 C void 指针 C 悬垂指针 C 解引用指针 C Near、Far 和 Huge 指针 C 指针数组的初始化 C 指针与多维数组

C 语言中的字符串

C 字符串 C 字符串数组 C 特殊字符

C 语言的结构体和联合

C 结构体 C 结构体和函数 C 结构体数组 C 自引用结构 C 查找表 C 点 (.) 运算符 C 枚举(或 enum) C 结构填充和打包 C 嵌套结构 C 匿名结构和联合 C 联合 C Bit 位字段 C Typedef

C 语言中的文件处理

C 输入和输出 C 文件 I/O(文件处理)

C 语言中的预处理器

C 预处理器 C #pragma 编译指示 C 预处理器操作符 C 宏 C 头文件

C 语言中的内存管理

C 内存管理 C 内存地址 C 存储类

C 其他主题

C 错误处理 C 可变参数 C 命令执行 C 数学函数 C static 静态关键字 C 随机数生成 C 命令行参数

C 语言编程资源

C 语言问题与解答答案 C 语言快速指南 C 语言速查表 C 语言实用资源 C 语言讨论


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 结构的流程图如下 -

C 语言中的 switch 语句

switch-case 语句使用规则

以下规则适用于 switch 语句 -

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

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

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

  • 当被 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"值测试代码输出。

c_decision_making.html