[PIC®/AVR®/dsPIC®产品]

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

[复制链接]
16955|38
手机看帖
扫描二维码
随时随地手机跟帖
gaoyang9992006|  楼主 | 2023-3-1 17:43 | 显示全部楼层 |阅读模式
今天看到了一段充满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 能够控制一些例外情况并提高可读性

使用特权

评论回复
评论
masonghua 2023-3-27 14:13 回复TA
有点看晕了,可以解答一下吗 
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少那么一丢丢内存空间。不知道不同 的编译器会不会有区别。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:西安公路研究院南京院
简介:主要工作从事监控网络与通信网络设计,以及从事基于嵌入式的通信与控制设备研发。擅长单片机嵌入式系统物联网设备开发,音频功放电路开发。

1905

主题

15675

帖子

200

粉丝