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 代码块的最后一个语句都是 breakbreak 语句将控制权移出 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)块中有多个语句,则必须将它们放在花括号内。因此,如果您的代码包含许多 ifelse 语句,那么包含如此多左右花括号的代码会显得笨拙。 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