C Switch 语句

2025年3月27日 | 阅读 8 分钟

C 语言中的 switch 语句是 if-else-if 梯形语句的替代方案,它允许我们对单个变量(称为 switch 变量)的不同可能值执行多个操作。在这里,我们可以为单个变量的不同值在多个 case 中定义各种语句。

C 语言中 switch 语句的语法如下:

C 语言 switch 语句的规则

  1. switch 表达式必须是整数或字符类型。
  2. case 值必须是整数或字符常量。
  3. case 值只能在 switch 语句内部使用。
  4. switch case 中的 break 语句不是必需的。它是可选的。如果在 case 中找不到 break 语句,则将执行匹配 case 之后的所有 case。这被称为 C switch 语句的贯穿(fall through)状态。

让我们通过示例来理解它。我们假设有以下变量。


 
有效的 Switch无效的 Switch有效的 Case无效的 Case
switch(x)switch(f)case 3;case 2.5;
switch(x>y)switch(x+2.5)case 'a';case x;
switch(a+b-2) case 1+2;case x+2;
switch(func(x,y)) case 'x'>'y';case 1,2,3;

C 语言 Switch 语句流程图

flow of switch statement in c

switch case 语句的功能

首先,对 switch 语句中指定的整数表达式进行求值。然后,将此值与不同 case 中给出的常量值一一进行匹配。如果找到匹配项,则将执行该 case 中指定的所有语句,以及该 case 之后的所有 case,包括 default 语句。任何两个 case 都不能具有相同的值。如果匹配的 case 包含 break 语句,则将跳过之后的所有 case,并将控制权移出 switch。否则,将执行匹配 case 之后的所有 case。

C 语言的 switch 语句如何工作?

让我们逐步了解 C 语言 switch 语句的工作过程。

考虑以下switch 语句

C 语言程序

示例

编译并运行

输出

Value is 2

分步过程

  1. switch 变量 num进行求值。在此示例中,num被初始化为值 2
  2. 求值后的 num (2) 值switch 块内每个 case 标签中指定的常量进行比较。
  3. switch 语句求值后的值 (2)第二个 case (case 2)中指定的常量进行匹配。由于存在匹配项,程序将跳转到与匹配的 case (case 2)关联的代码块。
  4. 将执行与case 2关联的代码块,该代码块将向控制台打印“Value is 2”
  5. case 2的代码块中存在“break”关键字。因此,程序在执行完此 case 块后会立即跳出 switch 语句。
  6. 程序控制将继续执行switch 语句之后的语句,并将执行 switch 语句之后的任何语句。在本例中,switch 之后没有语句,因此程序终止。
  7. switch 语句求值了变量 num的值,找到了与 case 2 的匹配项,执行了相应的代码块,然后由于存在“break” 语句而退出了switch 块

C 语言 switch 语句示例

让我们看一个简单的 C 语言 switch 语句示例。

示例

编译并运行

输出

enter a number:4
number is not equal to 10, 50 or 100

enter a number:50
number is equal to 50

Switch case 示例 2

示例

编译并运行

输出

hi	

Break 和 Default 关键字在 Switch 语句中的作用

让我们结合示例代码和输出,解释和定义 switch 语句中的“break”“default”关键字

1. Break 关键字

“break”关键字用于在每个 case 的代码块内提前终止 switch 语句。当程序在 case 块中遇到“break”语句时,它会立即退出switch 语句,从而阻止后续 case 块的执行。“break”语句对于避免 switch 语句的“贯穿”行为至关重要。

示例

让我们看一个程序来理解 C 语言中break 关键字的用法。

示例

编译并运行

输出

Value is 3

说明

在此示例中,switch 语句变量 num(值为3)的值进行求值,并将其与case 3进行匹配。将执行与case 3关联的代码块,向控制台打印“Value is 3”case 3中的“break”语句确保程序在执行完此 case 块后立即退出 switch 语句,从而阻止执行任何其他 case。

2. Default 关键字

任何 case 常量都不匹配求值表达式时,它就充当通配符 case。如果没有匹配的 case 并且存在“default” case,则将运行与“default” case 关联的代码块。它通常用于处理未明确说明的给定输入的情况。

示例

让我们看一个程序来理解 C 语言中default 关键字的用法。

示例

编译并运行

输出

Value is not 1, 2, or 3

说明

在此示例中,switch 语句检查变量 num(值为5)的值。由于没有 case 匹配 num,程序将执行与“default” case关联的代码块。“default” case内的“break”语句确保程序在执行完“default” case 块后退出switch 语句

“break”“default”关键字在控制 switch 语句内的执行流程方面都发挥着至关重要的作用。“break”语句有助于防止贯穿行为,而“default” case提供了一种处理未匹配 case 的方法。

C Switch 语句的贯穿特性

在 C 语言中,switch 语句具有贯穿特性;这意味着如果您不在 switch case 中使用 break 语句,那么匹配 case 之后的所有 case 都将被执行。

让我们通过下面给出的示例来理解 switch 语句的贯穿状态。

示例

编译并运行

输出

enter a number:10
number is equal to 10
number is equal to 50
number is equal to 100
number is not equal to 10, 50 or 100

输出

enter a number:50
number is equal to 50
number is equal to 100
number is not equal to 10, 50 or 100

嵌套 switch case 语句

我们可以在一个 switch 语句中使用任意数量的 switch 语句。这种类型的语句称为嵌套 switch case 语句。考虑以下示例。

示例

编译并运行

输出

the value of i evaluated in outer switch: 10
The value of j evaluated in nested switch: 20
Exact value of i is : 10
Exact value of j is : 20 

Switch 语句的优点

C 语言中的switch 语句有几个优点。switch 语句的一些主要优点如下:

  • 可读性和清晰度:switch 语句提供了一种简洁明了的方式来表达代码中的多路分支。与多个嵌套 if-else 语句相比,处理多个 case 可以使代码更有条理,更易于阅读。
  • 效率:当处理多个条件时,switch 语句通常比一系列if-else 语句更有效。它充当直接跳转表,使其在执行时间方面更快、更优化。
  • 基于 case 的逻辑:当程序需要根据单个变量的特定值做出决策时,switch 语句自然适用于这些场景。它是实现基于 case 的逻辑的一种直观而简单的方法。

switch 语句支持使用 default case,它充当不匹配任何给定 case 的值的通用选项。这个default case处理未明确说明的不寻常输入或情况。

Switch 语句的缺点

C 语言中的switch 语句有几个缺点。switch 语句的一些主要缺点如下:

  • 表达式受限:switch 语句中使用的表达式必须产生整数值(char, int, enum)或兼容的数据类型。它无法处理更复杂或非常量表达式,这在某些情况下限制了其灵活性
  • 无法比较范围:if-else 语句不同,switch 语句无法直接处理值范围。switch 语句中的每个 case 代表一个特定的常量值,这使得处理值范围效率低下。
  • 不支持浮点数:switch 语句仅接受整数类型(整数)enum中的值;它不接受浮点数。它不处理非整数数据类型,例如浮点整数,这在某些情况下可能会有问题。
  • 贯穿行为:Switch 语句默认具有“贯穿”行为,这意味着如果一个 case 不包含“break”语句,执行将“贯穿”到下一个 case 块。如果管理不当,这可能会导致意外行为。
  • 代码重复:在某些情况下,使用switch 语句可能会导致代码重复,特别是当多个 case 需要相同的操作时。如果管理不当,这可能会导致代码重复。
  • 嵌套 switches 可能变得复杂:在处理嵌套switch 语句时,代码可能会变得复杂且可读性降低。理解和维护这种嵌套结构可能需要额外的努力。

下一主题if-else vs switch