c语言中,switch case 结构如何改进

时间:2023-02-06 14:35:59
请教高手有什么好的办法让case 少一点,代码太难看了,case太多,圈复杂度也太高

22 个解决方案

#1


没有万能的改进方法,需具体问题具体分析,上代码。

#2


要精简case,那么你的算法就做到最优。

#3


有些时候,确实没办法。。。

#4


case的情况归类,然后switch类,再掉具体类的函数,函数里面小switch。

#5


额 不用!

#6


用 enum 定义 case 数值

将每一个 case 的处理写成单独的函数

加注释

#7


楼主的困难有2个方面
1,case分支太多,程序可读性变差
2,case分支太多,影响了程序的执行效率

如果是第1条,属于友好编码的范畴
如果是第2条,则是必须要解决的

对于这种问题,可以考虑采用 表驱动法

楼主不妨把具体的需求说一下,然后可以制定一个合适的 表驱动法 来解决

#8


C99 标准支持 case一个范围  比如 case 'A' ... 'Z':   楼主可以看看

#9


看你自己的需求。。这个一般不能改进。。。

#10


case太多,圈复杂度也太高

case 不会随着多少而增加执行的效率,具体你去看生成后的汇编。

#11


引用 10 楼  的回复:
case太多,圈复杂度也太高

case 不会随着多少而增加执行的效率,具体你去看生成后的汇编。


我直觉上认为case的分支多了,的确会影响执行效率
请问10楼,生成后的汇编怎么证明case分支的多少与执行效率无关的?
请教了

#12


引用 11 楼  的回复:
引用 10 楼  的回复:

case太多,圈复杂度也太高

case 不会随着多少而增加执行的效率,具体你去看生成后的汇编。


我直觉上认为case的分支多了,的确会影响执行效率
请问10楼,生成后的汇编怎么证明case分支的多少与执行效率无关的?
请教了

我想10L所说的执行效率应该是指运行速度吧。

switch-case结构的实现原理是向量表。编译程序会为每一个switch-case结构分配一个向量表,表元的大小为址长度(以32位系统为例就是4Byte),现假设向量表首地址为A。
case 0:后面的代码首地址存入A;
case 1:后面的代码首地址存入A+4;
case 2:后面的代码首地址存入A+8,照此类推。

不管case分支有多少,switch-case结构在运行时都只执行了两个指令:加法(add)和寻址跳转(jmp)。

但严格的说,程序运行效率不止包含运行速度一方面,还有内存消耗也是很重要的方面。可见case分支过多虽不会影响运行速度,但会增大辅助内存的用量。

#13


1.将case后处理封装为函数,如LS的Anyidan所言----可以使switch/case结构清晰
2.按case的常量性质调整顺序:
a:如果是1,2,3或a,b,c之类的,按序排列,且不要省略(即使不用也不省)----可读性好
b:如果是用宏名字或枚举常量之类的,按意群排列----可读性好
3.当代码内容稳定后再考虑用跳转表固化因果关系

#14


把 case 值与响应函数封装到表里,循环查表吧。

#15


编译器对switch case的优化只比自己hash funptr[]稍逊。

#16


引用 12 楼  的回复:
引用 11 楼  的回复:

引用 10 楼  的回复:

case太多,圈复杂度也太高

case 不会随着多少而增加执行的效率,具体你去看生成后的汇编。


我直觉上认为case的分支多了,的确会影响执行效率
请问10楼,生成后的汇编怎么证明case分支的多少与执行效率无关的?
请教了

我想10L所说的执行效率应该是指运行速度吧。

switch-case结构……


学习了

#17


对啊,枚举呗

#18


如果是C++的话,可以使用继承,重载等.(个人意见)

#19


看你怎么用了。
枚举 数组 有的时候更有用

#20


学习了,帮顶一下吧

正如楼上多位所言

如果case分支处理比较整齐一致,可以利用函数来使代码整洁

如果可以用函数数组来处理,那是再好不过了

#21


感谢大家的回复,觉得枚举和表驱动法应该可行,我还要去多多学习~

#22


switch-case的优化可是很犀利的,不同的情况用不同的优化,优化后速度大大增加

#1


没有万能的改进方法,需具体问题具体分析,上代码。

#2


要精简case,那么你的算法就做到最优。

#3


有些时候,确实没办法。。。

#4


case的情况归类,然后switch类,再掉具体类的函数,函数里面小switch。

#5


额 不用!

#6


用 enum 定义 case 数值

将每一个 case 的处理写成单独的函数

加注释

#7


楼主的困难有2个方面
1,case分支太多,程序可读性变差
2,case分支太多,影响了程序的执行效率

如果是第1条,属于友好编码的范畴
如果是第2条,则是必须要解决的

对于这种问题,可以考虑采用 表驱动法

楼主不妨把具体的需求说一下,然后可以制定一个合适的 表驱动法 来解决

#8


C99 标准支持 case一个范围  比如 case 'A' ... 'Z':   楼主可以看看

#9


看你自己的需求。。这个一般不能改进。。。

#10


case太多,圈复杂度也太高

case 不会随着多少而增加执行的效率,具体你去看生成后的汇编。

#11


引用 10 楼  的回复:
case太多,圈复杂度也太高

case 不会随着多少而增加执行的效率,具体你去看生成后的汇编。


我直觉上认为case的分支多了,的确会影响执行效率
请问10楼,生成后的汇编怎么证明case分支的多少与执行效率无关的?
请教了

#12


引用 11 楼  的回复:
引用 10 楼  的回复:

case太多,圈复杂度也太高

case 不会随着多少而增加执行的效率,具体你去看生成后的汇编。


我直觉上认为case的分支多了,的确会影响执行效率
请问10楼,生成后的汇编怎么证明case分支的多少与执行效率无关的?
请教了

我想10L所说的执行效率应该是指运行速度吧。

switch-case结构的实现原理是向量表。编译程序会为每一个switch-case结构分配一个向量表,表元的大小为址长度(以32位系统为例就是4Byte),现假设向量表首地址为A。
case 0:后面的代码首地址存入A;
case 1:后面的代码首地址存入A+4;
case 2:后面的代码首地址存入A+8,照此类推。

不管case分支有多少,switch-case结构在运行时都只执行了两个指令:加法(add)和寻址跳转(jmp)。

但严格的说,程序运行效率不止包含运行速度一方面,还有内存消耗也是很重要的方面。可见case分支过多虽不会影响运行速度,但会增大辅助内存的用量。

#13


1.将case后处理封装为函数,如LS的Anyidan所言----可以使switch/case结构清晰
2.按case的常量性质调整顺序:
a:如果是1,2,3或a,b,c之类的,按序排列,且不要省略(即使不用也不省)----可读性好
b:如果是用宏名字或枚举常量之类的,按意群排列----可读性好
3.当代码内容稳定后再考虑用跳转表固化因果关系

#14


把 case 值与响应函数封装到表里,循环查表吧。

#15


编译器对switch case的优化只比自己hash funptr[]稍逊。

#16


引用 12 楼  的回复:
引用 11 楼  的回复:

引用 10 楼  的回复:

case太多,圈复杂度也太高

case 不会随着多少而增加执行的效率,具体你去看生成后的汇编。


我直觉上认为case的分支多了,的确会影响执行效率
请问10楼,生成后的汇编怎么证明case分支的多少与执行效率无关的?
请教了

我想10L所说的执行效率应该是指运行速度吧。

switch-case结构……


学习了

#17


对啊,枚举呗

#18


如果是C++的话,可以使用继承,重载等.(个人意见)

#19


看你怎么用了。
枚举 数组 有的时候更有用

#20


学习了,帮顶一下吧

正如楼上多位所言

如果case分支处理比较整齐一致,可以利用函数来使代码整洁

如果可以用函数数组来处理,那是再好不过了

#21


感谢大家的回复,觉得枚举和表驱动法应该可行,我还要去多多学习~

#22


switch-case的优化可是很犀利的,不同的情况用不同的优化,优化后速度大大增加