news 2026/4/23 3:28:23

switch-case 语句分析(消灭swich-case方法)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
switch-case 语句分析(消灭swich-case方法)

author: hjjdebug
date: 2026年 01月 23日 星期五 10:46:02 CST
descrip: switch-case 语句分析(消灭swich-case方法)


文章目录

  • 1. switch-case 的缺点
  • 2. 消灭switch-case 的两种方式.
    • 2.1. 刻意定义的函数指针数组
    • 2.2. 更一般的type-handler 结构体数组
  • 3 完整的演示代码(c代码):
  • 4.程序运行结果:

1. switch-case 的缺点

switch-case语句不符合封闭性原则. 我见过一个家伙写MFC的消息分发函数,写了几千行.
显著的毛病有2个

  1. 一个函数的代码太长, 看不见头尾. 这样你难以把握整体意思.
  2. 函数封闭不了,一旦要添加一个消息,或者修改一个消息,又要改这个大函数.

2. 消灭switch-case 的两种方式.

2.1. 刻意定义的函数指针数组

把消息的处理部分定义成一个个函数, 把这些函数地址组织成一个数组.
即func_array[]={handler1,handler2,…}
就是说知道了type, 则从func_array[type] 处,要刚好能拿到其对应的handler.
这要求type从0开始,并且type还连续, 并且你还要把type对应的handler,正好放到
func_array 数组的对应位置处.
用法示例:
// 函数指针数组
void (*func_array[])(void) = {case_0, case_1, case_2};
int array_size = sizeof(func_array) / sizeof(func_array[0]);

// 使用函数指针数组 if (type >= 0 && type < array_size) { func_array[type](); } else { default_case(); }

2.2. 更一般的type-handler 结构体数组

没有那么多正好, type可能是随便定义的, 那应该用结构数组来代替函数数组.
让每一种type,都对应一个handler,构建成结构数组.
以后根据类型type, 就能找到对应的handler, 这是更一般的应对散转类型的方式
用法示例:
// 方法2: 定义结构体(适用于不连续值)
typedef struct {
int type;
void (*func)(void);
} switch_case_t;

//定义查找表 switch_case_t switch_table[] = { {0, case_0}, {5, case_1}, {10, case_2} }; int table_size = sizeof(switch_table) / sizeof(switch_table[0]); // 根据type,查找对应的处理函数,并执行之 int found = 0; for (int i = 0; i < table_size; i++) { if (switch_table[i].type == type) { switch_table[i].func(); found = 1; break; } } if (!found) { //未找到,执行默认选项 default_case(); }

为什么我们能够消灭switch-case, 是怎样消灭的switch-case. 我常常问自己.
因为我们把handler 组织了起来, 我们通过查找一个数组或者链表找到handler
而这个查找的过程用的是遍历,没有用switch-case, 找到了hander,则执行handler,
用此法消灭了swich-case.

3 完整的演示代码(c代码):

$catcase.c#include<stdio.h>// 定义处理函数voidcase_0(){printf("执行 case 0\n");}voidcase_1(){printf("执行 case 1\n");}voidcase_2(){printf("执行 case 2\n");}voiddefault_case(){printf("执行默认情况\n");}intmain(){inttype=1;// 方法1: 使用函数指针数组(适用于连续值)// 精心构建一个函数指针数组,让func_array[type]就存储有对应的handlervoid(*func_array[])(void)={case_0,case_1,case_2};intarray_size=sizeof(func_array)/sizeof(func_array[0]);// 使用函数指针数组if(type>=0&&type<array_size){func_array[type]();}else{default_case();}// 方法2: 定义结构体(更一般的情况)typedefstruct{inttype;void(*func)(void);}switch_case_t;//定义查找表switch_case_t switch_table[]={{0,case_0},{5,case_1},{10,case_2}};inttable_size=sizeof(switch_table)/sizeof(switch_table[0]);// 查找匹配项intfound=0;for(inti=0;i<table_size;i++){if(switch_table[i].type==type){switch_table[i].func();found=1;break;}}if(!found){default_case();}return0;}

4.程序运行结果:

$ ./case
执行 case 1
执行默认情况

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/23 14:02:27

为什么Qwen3-14B适合中小企业?单卡部署成本分析

为什么Qwen3-14B适合中小企业&#xff1f;单卡部署成本分析 1. 中小企业AI落地的现实困境 很多中小企业想用大模型&#xff0c;但一上来就被三座大山拦住&#xff1a;显存不够、算力太贵、运维复杂。买不起8卡H100服务器&#xff0c;租云服务按小时计费又烧钱&#xff0c;本地…

作者头像 李华
网站建设 2026/4/23 14:01:57

Emotion2Vec+语音情感系统使用技巧,提升识别准确率

Emotion2Vec语音情感系统使用技巧&#xff0c;提升识别准确率 1. 引言&#xff1a;为什么你的语音情感识别结果不够准&#xff1f; 你有没有遇到过这种情况&#xff1a;上传了一段明显带着愤怒情绪的语音&#xff0c;系统却识别成“中性”&#xff1f;或者一段轻快的笑声被判…

作者头像 李华
网站建设 2026/4/23 14:44:34

fft npainting lama疑问解答:标注无效怎么办?实战指南

FFT NPainting LaMa疑问解答&#xff1a;标注无效怎么办&#xff1f;实战指南 1. 问题背景&#xff1a;为什么标注了却提示“无效”&#xff1f; 你是不是也遇到过这种情况&#xff1a;明明用画笔在图上涂了一大片白色&#xff0c;点击“ 开始修复”后&#xff0c;状态栏却弹…

作者头像 李华
网站建设 2026/4/23 14:44:24

IQuest-Coder-V1部署性能瓶颈?KV Cache优化实战解析

IQuest-Coder-V1部署性能瓶颈&#xff1f;KV Cache优化实战解析 IQuest-Coder-V1-40B-Instruct 是一款面向软件工程和竞技编程的新一代代码大语言模型。它不仅在多个权威编码基准测试中表现卓越&#xff0c;还通过创新的训练范式和架构设计&#xff0c;重新定义了代码智能的边…

作者头像 李华
网站建设 2026/4/23 15:54:15

4个YOLO11实用功能:Jupyter/SSH/训练/推理全解析

4个YOLO11实用功能&#xff1a;Jupyter/SSH/训练/推理全解析 YOLO11并不是官方发布的模型版本——目前Ultralytics官方最新稳定版为YOLOv8&#xff0c;后续迭代为YOLOv9、YOLOv10等&#xff1b;YOLO11是社区或镜像平台对基于Ultralytics框架深度定制、功能增强的计算机视觉开发…

作者头像 李华
网站建设 2026/4/23 15:56:42

AutoGLM-Phone支持哪些手机?Android 7.0+适配实战验证

AutoGLM-Phone支持哪些手机&#xff1f;Android 7.0适配实战验证 1. 什么是AutoGLM-Phone&#xff1a;手机端AI智能助理的全新范式 Open-AutoGLM 是智谱开源的轻量级手机端AI Agent框架&#xff0c;它不是简单地把大模型“塞进手机”&#xff0c;而是构建了一套视觉理解 意图…

作者头像 李华