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

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

[复制链接]
16855|38
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
今天看到了一段充满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 确实更加灵活,具有普适性。

使用特权

评论回复
5
hjl2832| | 2023-3-5 08:26 | 只看该作者
还有很多时候,这些个if else是后面程序修修补补时慢慢增加功能时加的,到最后看到就变成如上的状态了。

使用特权

评论回复
6
icecut| | 2023-3-8 09:58 | 只看该作者
你就这几行代码,谈啥性能. init的代码一辈子就执行一次

使用特权

评论回复
7
icecut| | 2023-3-8 09:58 | 只看该作者
你就这几行代码,谈啥性能. init的代码一辈子就执行一次

使用特权

评论回复
8
hearstnorman323| | 2023-3-9 12:36 | 只看该作者
绝大部分情况下switch会快一点

使用特权

评论回复
9
janewood| | 2023-3-9 12:45 | 只看该作者
switch-case 和 if-else,哪个更好

使用特权

评论回复
10
nomomy| | 2023-3-10 11:23 | 只看该作者
switch的case 必须为已知条件,而if..else可以支持任何条件

使用特权

评论回复
11
wilhelmina2| | 2023-3-10 11:34 | 只看该作者
switch的效率在一定条件下是比if else高的。  

使用特权

评论回复
12
gaoyang9992006|  楼主 | 2023-3-10 11:36 | 只看该作者
icecut 发表于 2023-3-8 09:58
你就这几行代码,谈啥性能. init的代码一辈子就执行一次

可读性还是要考虑考虑的。

使用特权

评论回复
13
gaoyang9992006|  楼主 | 2023-3-10 11:37 | 只看该作者
wilhelmina2 发表于 2023-3-10 11:34
switch的效率在一定条件下是比if else高的。

是的,而且在较多的分支中,switch case 阅读性更好。

使用特权

评论回复
14
gaoyang9992006|  楼主 | 2023-3-10 11:37 | 只看该作者
hjl2832 发表于 2023-3-5 08:26
还有很多时候,这些个if else是后面程序修修补补时慢慢增加功能时加的,到最后看到就变成如上的状态了。 ...

嗯,是有这种可能不过这个项目中的部分不是这个可能导致的,就是上来就给搞成if else了。

使用特权

评论回复
15
dspmana| | 2023-3-10 11:52 | 只看该作者
如果在条件匹配少的情况下,可以使用if...else...但是如果匹配条件多的情况下可以使用可以使用switch。

使用特权

评论回复
16
backlugin| | 2023-3-10 13:25 | 只看该作者
在多路分支时用switch比if..else if .. else结构要效率高。

使用特权

评论回复
17
hilahope| | 2023-3-10 14:24 | 只看该作者
为什么很多程序员不用switch,而是大量的if……else if?

使用特权

评论回复
18
汽车电子| | 2023-3-11 17:30 | 只看该作者
确实性的才用switch

使用特权

评论回复
19
汽车电子| | 2023-3-11 17:30 | 只看该作者
确实性的才用switch

使用特权

评论回复
20
dw772| | 2023-3-14 11:51 | 只看该作者
我亲测过,switch代码更占内存空间,用if  else少那么一丢丢内存空间。不知道不同 的编译器会不会有区别。

使用特权

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

本版积分规则

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

1895

主题

15628

帖子

198

粉丝