在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 能够控制一些例外情况并提高可读性
而针对上述中引起这个提问的代码,很明显可以用switch case来代替。大家认为呢? 补充一点,有些代码用switch不利于后期判断的变更,如复合型判断,到时候又得改成if else forgot 发表于 2023-3-2 13:17
补充一点,有些代码用switch不利于后期判断的变更,如复合型判断,到时候又得改成if else ...
是的,不过这个判断是不需要的,因为对象就是数字,而且是唯一值。我很明白你的意思,if else 确实更加灵活,具有普适性。 还有很多时候,这些个if else是后面程序修修补补时慢慢增加功能时加的,到最后看到就变成如上的状态了。 你就这几行代码,谈啥性能. init的代码一辈子就执行一次 你就这几行代码,谈啥性能. init的代码一辈子就执行一次 绝大部分情况下switch会快一点 switch-case 和 if-else,哪个更好 switch的case 必须为已知条件,而if..else可以支持任何条件 switch的效率在一定条件下是比if else高的。 icecut 发表于 2023-3-8 09:58
你就这几行代码,谈啥性能. init的代码一辈子就执行一次
可读性还是要考虑考虑的。{:lol:} wilhelmina2 发表于 2023-3-10 11:34
switch的效率在一定条件下是比if else高的。
是的,而且在较多的分支中,switch case 阅读性更好。 hjl2832 发表于 2023-3-5 08:26
还有很多时候,这些个if else是后面程序修修补补时慢慢增加功能时加的,到最后看到就变成如上的状态了。 ...
嗯,是有这种可能不过这个项目中的部分不是这个可能导致的,就是上来就给搞成if else了。 如果在条件匹配少的情况下,可以使用if...else...但是如果匹配条件多的情况下可以使用可以使用switch。 在多路分支时用switch比if..else if .. else结构要效率高。 为什么很多程序员不用switch,而是大量的if……else if? 确实性的才用switch 确实性的才用switch 我亲测过,switch代码更占内存空间,用ifelse少那么一丢丢内存空间。不知道不同 的编译器会不会有区别。
页:
[1]
2