[PIC®/AVR®/dsPIC®产品] 在switch与if else之间该如何选择

[复制链接]
18261|38
 楼主| gaoyang9992006 发表于 2023-3-1 17:43 | 显示全部楼层 |阅读模式
今天看到了一段充满if else 的代码
  1. void NVIC_Init(NVIC_InitTypeDef *NVIC_InitStruct)
  2. {
  3.     uint8_t tmppre = 0;

  4.     if(NVIC_Priority_Group == NVIC_PriorityGroup_0)
  5.     {
  6.         NVIC_SetPriority(NVIC_InitStruct->NVIC_IRQChannel, NVIC_InitStruct->NVIC_IRQChannelSubPriority << 4);
  7.     }
  8.     else if(NVIC_Priority_Group == NVIC_PriorityGroup_1)
  9.     {
  10.         if(NVIC_InitStruct->NVIC_IRQChannelPreemptionPriority == 1)
  11.         {
  12.             NVIC_SetPriority(NVIC_InitStruct->NVIC_IRQChannel, (1 << 7) | (NVIC_InitStruct->NVIC_IRQChannelSubPriority << 4));
  13.         }
  14.         else
  15.         {
  16.             NVIC_SetPriority(NVIC_InitStruct->NVIC_IRQChannel, (0 << 7) | (NVIC_InitStruct->NVIC_IRQChannelSubPriority << 4));
  17.         }
  18.     }
  19.     else if(NVIC_Priority_Group == NVIC_PriorityGroup_2)
  20.     {
  21.         if(NVIC_InitStruct->NVIC_IRQChannelPreemptionPriority <= 1)
  22.         {
  23.             tmppre = NVIC_InitStruct->NVIC_IRQChannelSubPriority + (4 * NVIC_InitStruct->NVIC_IRQChannelPreemptionPriority);
  24.             NVIC_SetPriority(NVIC_InitStruct->NVIC_IRQChannel, (0 << 7) | (tmppre << 4));
  25.         }
  26.         else
  27.         {
  28.             tmppre = NVIC_InitStruct->NVIC_IRQChannelSubPriority + (4 * (NVIC_InitStruct->NVIC_IRQChannelPreemptionPriority - 2));
  29.             NVIC_SetPriority(NVIC_InitStruct->NVIC_IRQChannel, (1 << 7) | (tmppre << 4));
  30.         }
  31.     }
  32.     else if(NVIC_Priority_Group == NVIC_PriorityGroup_3)
  33.     {
  34.         if(NVIC_InitStruct->NVIC_IRQChannelPreemptionPriority <= 3)
  35.         {
  36.             tmppre = NVIC_InitStruct->NVIC_IRQChannelSubPriority + (2 * NVIC_InitStruct->NVIC_IRQChannelPreemptionPriority);
  37.             NVIC_SetPriority(NVIC_InitStruct->NVIC_IRQChannel, (0 << 7) | (tmppre << 4));
  38.         }
  39.         else
  40.         {
  41.             tmppre = NVIC_InitStruct->NVIC_IRQChannelSubPriority + (2 * (NVIC_InitStruct->NVIC_IRQChannelPreemptionPriority - 4));
  42.             NVIC_SetPriority(NVIC_InitStruct->NVIC_IRQChannel, (1 << 7) | (tmppre << 4));
  43.         }
  44.     }
  45.     else if(NVIC_Priority_Group == NVIC_PriorityGroup_4)
  46.     {
  47.         NVIC_SetPriority(NVIC_InitStruct->NVIC_IRQChannel, NVIC_InitStruct->NVIC_IRQChannelPreemptionPriority << 4);
  48.     }

  49.     if(NVIC_InitStruct->NVIC_IRQChannelCmd != DISABLE)
  50.     {
  51.         NVIC_EnableIRQ(NVIC_InitStruct->NVIC_IRQChannel);
  52.     }
  53.     else
  54.     {
  55.         NVIC_DisableIRQ(NVIC_InitStruct->NVIC_IRQChannel);
  56.     }
  57. }
然后我思考了这个问题?
是不是可以选择用switch case 缓解众多if elseif 造成的焦虑?
在确定你想使用switch/case或者 if/elseif语句时,很重要的一点是明确使用哪一种才能达到最高的性能。
我推荐使用下面的指南来帮助你选择:
如果已有条件比较相关,switch / case可以是更快更明确的选择
如果你想检查多个不关联的条件,if / elseif可以是最好的选择
如果条件之间存在逻辑上的分歧,同样优先使用if/elseif
如果意图在代码中不明显, if / elseif的结构也可以很容易的进行修改
使用 switch / case 语句会显著减少代码量
如果你想测试和比较相同数据类型的值(如字符串和数字),使用 switch / case 能够控制一些例外情况并提高可读性

评论

有点看晕了,可以解答一下吗  发表于 2023-3-27 14:13
 楼主| gaoyang9992006 发表于 2023-3-1 17:46 | 显示全部楼层
而针对上述中引起这个提问的代码,很明显可以用switch case来代替。大家认为呢?
forgot 发表于 2023-3-2 13:17 | 显示全部楼层
补充一点,有些代码用switch不利于后期判断的变更,如复合型判断,到时候又得改成if else
 楼主| gaoyang9992006 发表于 2023-3-2 17:34 | 显示全部楼层
forgot 发表于 2023-3-2 13:17
补充一点,有些代码用switch不利于后期判断的变更,如复合型判断,到时候又得改成if else ...

是的,不过这个判断是不需要的,因为对象就是数字,而且是唯一值。我很明白你的意思,if else 确实更加灵活,具有普适性。
hjl2832 发表于 2023-3-5 08:26 | 显示全部楼层
还有很多时候,这些个if else是后面程序修修补补时慢慢增加功能时加的,到最后看到就变成如上的状态了。
icecut 发表于 2023-3-8 09:58 | 显示全部楼层
你就这几行代码,谈啥性能. init的代码一辈子就执行一次
icecut 发表于 2023-3-8 09:58 | 显示全部楼层
你就这几行代码,谈啥性能. init的代码一辈子就执行一次
hearstnorman323 发表于 2023-3-9 12:36 | 显示全部楼层
绝大部分情况下switch会快一点
janewood 发表于 2023-3-9 12:45 | 显示全部楼层
switch-case 和 if-else,哪个更好
nomomy 发表于 2023-3-10 11:23 | 显示全部楼层
switch的case 必须为已知条件,而if..else可以支持任何条件
wilhelmina2 发表于 2023-3-10 11:34 | 显示全部楼层
switch的效率在一定条件下是比if else高的。  
 楼主| gaoyang9992006 发表于 2023-3-10 11:36 | 显示全部楼层
icecut 发表于 2023-3-8 09:58
你就这几行代码,谈啥性能. init的代码一辈子就执行一次

可读性还是要考虑考虑的。
 楼主| gaoyang9992006 发表于 2023-3-10 11:37 | 显示全部楼层
wilhelmina2 发表于 2023-3-10 11:34
switch的效率在一定条件下是比if else高的。

是的,而且在较多的分支中,switch case 阅读性更好。
 楼主| gaoyang9992006 发表于 2023-3-10 11:37 | 显示全部楼层
hjl2832 发表于 2023-3-5 08:26
还有很多时候,这些个if else是后面程序修修补补时慢慢增加功能时加的,到最后看到就变成如上的状态了。 ...

嗯,是有这种可能不过这个项目中的部分不是这个可能导致的,就是上来就给搞成if else了。
dspmana 发表于 2023-3-10 11:52 | 显示全部楼层
如果在条件匹配少的情况下,可以使用if...else...但是如果匹配条件多的情况下可以使用可以使用switch。
backlugin 发表于 2023-3-10 13:25 | 显示全部楼层
在多路分支时用switch比if..else if .. else结构要效率高。
hilahope 发表于 2023-3-10 14:24 | 显示全部楼层
为什么很多程序员不用switch,而是大量的if……else if?
汽车电子 发表于 2023-3-11 17:30 | 显示全部楼层
确实性的才用switch
汽车电子 发表于 2023-3-11 17:30 | 显示全部楼层
确实性的才用switch
dw772 发表于 2023-3-14 11:51 | 显示全部楼层
我亲测过,switch代码更占内存空间,用if  else少那么一丢丢内存空间。不知道不同 的编译器会不会有区别。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:如果你觉得我的分享或者答复还可以,请给我点赞,谢谢。

2052

主题

16404

帖子

222

粉丝
快速回复 在线客服 返回列表 返回顶部