gaoyang9992006 发表于 2023-3-1 17:43

在switch与if else之间该如何选择

今天看到了一段充满if else 的代码
void NVIC_Init(NVIC_InitTypeDef *NVIC_InitStruct)
{
    uint8_t tmppre = 0;

    if(NVIC_Priority_Group == NVIC_PriorityGroup_0)
    {
      NVIC_SetPriority(NVIC_InitStruct->NVIC_IRQChannel, NVIC_InitStruct->NVIC_IRQChannelSubPriority << 4);
    }
    else if(NVIC_Priority_Group == NVIC_PriorityGroup_1)
    {
      if(NVIC_InitStruct->NVIC_IRQChannelPreemptionPriority == 1)
      {
            NVIC_SetPriority(NVIC_InitStruct->NVIC_IRQChannel, (1 << 7) | (NVIC_InitStruct->NVIC_IRQChannelSubPriority << 4));
      }
      else
      {
            NVIC_SetPriority(NVIC_InitStruct->NVIC_IRQChannel, (0 << 7) | (NVIC_InitStruct->NVIC_IRQChannelSubPriority << 4));
      }
    }
    else if(NVIC_Priority_Group == NVIC_PriorityGroup_2)
    {
      if(NVIC_InitStruct->NVIC_IRQChannelPreemptionPriority <= 1)
      {
            tmppre = NVIC_InitStruct->NVIC_IRQChannelSubPriority + (4 * NVIC_InitStruct->NVIC_IRQChannelPreemptionPriority);
            NVIC_SetPriority(NVIC_InitStruct->NVIC_IRQChannel, (0 << 7) | (tmppre << 4));
      }
      else
      {
            tmppre = NVIC_InitStruct->NVIC_IRQChannelSubPriority + (4 * (NVIC_InitStruct->NVIC_IRQChannelPreemptionPriority - 2));
            NVIC_SetPriority(NVIC_InitStruct->NVIC_IRQChannel, (1 << 7) | (tmppre << 4));
      }
    }
    else if(NVIC_Priority_Group == NVIC_PriorityGroup_3)
    {
      if(NVIC_InitStruct->NVIC_IRQChannelPreemptionPriority <= 3)
      {
            tmppre = NVIC_InitStruct->NVIC_IRQChannelSubPriority + (2 * NVIC_InitStruct->NVIC_IRQChannelPreemptionPriority);
            NVIC_SetPriority(NVIC_InitStruct->NVIC_IRQChannel, (0 << 7) | (tmppre << 4));
      }
      else
      {
            tmppre = NVIC_InitStruct->NVIC_IRQChannelSubPriority + (2 * (NVIC_InitStruct->NVIC_IRQChannelPreemptionPriority - 4));
            NVIC_SetPriority(NVIC_InitStruct->NVIC_IRQChannel, (1 << 7) | (tmppre << 4));
      }
    }
    else if(NVIC_Priority_Group == NVIC_PriorityGroup_4)
    {
      NVIC_SetPriority(NVIC_InitStruct->NVIC_IRQChannel, NVIC_InitStruct->NVIC_IRQChannelPreemptionPriority << 4);
    }

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

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的代码一辈子就执行一次

可读性还是要考虑考虑的。{:lol:}

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代码更占内存空间,用ifelse少那么一丢丢内存空间。不知道不同 的编译器会不会有区别。
页: [1] 2
查看完整版本: 在switch与if else之间该如何选择