switch函数的5个经典示例,让你彻底告别冗长的if-else链


在编程中,

switch

语句是一种多分支选择结构,它根据一个表达式的值,跳转到匹配的

case

分支执行,相比

if-else

链,

switch

代码更清晰、可读性更强,尤其在处理固定数量的离散值时优势明显。

代码更清晰、可读性更强,尤其在处理固定数量的离散值时优势明显。

很多初学者只停留在“用switch替代多个if-else”的层面,忽略了它的灵活性和陷阱,本文通过5个经典示例,带你从零到一掌握

switch

函数(文中以类C语言演示,部分语言如JavaScript、C#、Java均适用)。

函数(文中以类C语言演示,部分语言如JavaScript、C#、Java均适用)。

示例1:基础数字映射——星期转换

用途:将数字1~7转换为对应星期名称,这是最基础的

switch

用法,强调一一对应关系。

用法,强调一一对应关系。

#include <stdio.h>

void printDay(int day) {

switch (day) {

case 1: printf("Monday\n"); break;

case 2: printf("Tuesday\n"); break;

case 3: printf("Wednesday\n"); break;

case 4: printf("Thursday\n"); break;

case 5: printf("Friday\n"); break;

case 6: printf("Saturday\n"); break;

case 7: printf("Sunday\n"); break;

default: printf("Invalid day\n"); break;

}

}

经典原因:展示了

switch

的基本结构——

case

常量、

break

防止穿透、

default

处理异常,这是所有程序员入门

switch

的第一个示例。

的第一个示例。

示例2:无break穿透——状态机与菜单选择

用途:利用

switch

的“穿透”(fall-through)特性,实现连续匹配,常用于模拟有限状态机或简化重复逻辑。

的“穿透”(fall-through)特性,实现连续匹配,常用于模拟有限状态机或简化重复逻辑。

void processCommand(char cmd) {

switch (cmd) {

case 'a':

case 'A':

printf("Add item\n");

break;

case 'd':

case 'D':

printf("Delete item\n");

break;

case 'q':

case 'Q':

printf("Quit\n");

break;

default:

printf("Unknown command\n");

break;

}

}

经典原因:许多初学者误以为每个

case

必须带

break

,而本例展示了如何利用穿透将多个条件合并为一个处理分支,注意:穿透需要明确注释,否则容易引入bug。

,而本例展示了如何利用穿透将多个条件合并为一个处理分支,注意:穿透需要明确注释,否则容易引入bug。

示例3:枚举类型结合——错误码处理

用途:将

switch

与枚举(

enum

)结合,使代码语义化更强,且避免魔法数字。

)结合,使代码语义化更强,且避免魔法数字。

typedef enum {

SUCCESS = 0,

FILE_NOT_FOUND,

PERMISSION_DENIED,

OUT_OF_MEMORY

} ErrorCode;

void handleError(ErrorCode code) {

switch (code) {

case SUCCESS:

printf("Operation succeeded.\n");

break;

case FILE_NOT_FOUND:

printf("Error: File not found.\n");

break;

case PERMISSION_DENIED:

printf("Error: Permission denied.\n");

break;

case OUT_OF_MEMORY:

printf("Error: Out of memory.\n");

break;

default:

printf("Unknown error code.\n");

break;

}

}

经典原因:枚举为

switch

提供了类型安全,编译器可以警告未覆盖的枚举值(部分语言如C#、Java的

switch

支持枚举),这是编写健壮代码的常用模式。

支持枚举),这是编写健壮代码的常用模式。

示例4:switch在JavaScript中的灵活应用——返回表达式

用途:在JavaScript(ES6+)中,

switch

配合函数直接返回结果,或使用

switch

作为表达式(需借助立即执行函数或

return

)。

)。

// 一、普通switch返回

function getFruitPrice(name) {

let price = 0;

switch (name) {

case 'apple':

price = 3.5;

break;

case 'banana':

price = 2.0;

break;

case 'cherry':

price = 5.0;

break;

default:

price = 0;

}

return price;

}

// 二、利用switch作为表达式(借助立即执行函数)

function getFruitPriceV2(name) {

return (() => {

switch (name) {

case 'apple': return 3.5;

case 'banana': return 2.0;

case 'cherry': return 5.0;

default: return 0;

}

})();

}

经典原因:展示了

switch

在不同语言中的微妙差异——JavaScript

switch

case

可以跟任意表达式,且常用

return

替代

break

简化代码,注意:JavaScript 的

switch

使用严格比较()。

使用严格比较()。

示例5:编译时优化与跳转表——性能敏感的字符分类

用途:当

case

数量较多且值连续时,编译器常将

switch

优化为跳转表(Jump Table),性能优于

if-else

链,判断数字字符或字母。

链,判断数字字符或字母。

#include <ctype.h>

int classifyChar(char c) {

switch (c) {

case '0': case '1': case '2': case '3': case '4':

case '5': case '6': case '7': case '8': case '9':

return 1; // digit

case 'a': case 'b': case 'c': case 'd': case 'e':

case 'f': case 'g': case 'h': case 'i': case 'j':

case 'k': case 'l': case 'm': case 'n': case 'o':

case 'p': case 'q': case 'r': case 's': case 't':

case 'u': case 'v': case 'w': case 'x': case 'y':

case 'z':

case 'A': case 'B': case 'C': case 'D': case 'E':

case 'F': case 'G': case 'H': case 'I': case 'J':

case 'K': case 'L': case 'M': case 'N': case 'O':

case 'P': case 'Q': case 'R': case 'S': case 'T':

case 'U': case 'V': case 'W': case 'X': case 'Y':

case 'Z':

return 2; // letter

default:

return 0; // other

}

}

经典原因:虽然可以用

isdigit()isalpha()

实现,但本示例展示了

switch

对连续值的合并写法,以及编译器优化的原理,当

case

值密集且数量较多时,跳转表只需一次计算即可定位,时间复杂度O(1)。

值密集且数量较多时,跳转表只需一次计算即可定位,时间复杂度O(1)。


总结与最佳实践

通过以上5个示例,我们看到了

switch

函数从基础到进阶的多种面貌:

函数从基础到进阶的多种面貌:

  1. 数字映射(示例1)——基础结构。
  2. 穿透利用(示例2)——合并同类项。
  3. 枚举配合(示例3)——类型安全与可读性。
  4. 语言差异(示例4)——return vs break。
  5. 性能优化(示例5)——跳转表原理。

使用建议

  • 当分支数超过3个且条件是离散常量时,优先使用
  • switch

  • 务必为每个
  • case

    明确添加

    break

    (除非故意穿透并注释)。

  • (除非故意穿透并注释)。
  • 善用
  • default

    处理意外输入。

  • 处理意外输入。
  • 在性能敏感的代码中,可考虑使用
  • switch

    替代

    if-else

    链(编译器通常会优化)。

  • 链(编译器通常会优化)。
  • 希望这5个经典示例能帮助你真正理解并活用

    switch

    函数,写出更简洁、更高效的代码。

    函数,写出更简洁、更高效的代码。

    一篇文章掌握switch函数,5个经典示例-switch游戏下载社区