找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1123|回复: 11
打印 上一主题 下一主题
收起左侧

C语言else if与switch怎么用比较合适?在多分支的时候,有没有效率说法?

[复制链接]
跳转到指定楼层
楼主
ID:734017 发表于 2022-4-15 23:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
请教一下,谢谢大家

例如:uchar Reuse_count=0;        //复用计时
bit Reuse=0;        //复用计时标志


void TM0_Isr() interrupt 1                                        //定时器0中断
{               
        Reuse=~Reuse;

}


void time_sharing()
{
        if(Reuse)
        {
                Reuse=~Reuse;
                Reuse_count++;
               
        }

}

void Reuse_time_sharing()
{
        if(Reuse_count==1)
               
                else if(Reuse_count==2)
               
                        else if(Reuse_count==3)
                                
                                else if(Reuse_count==4)
                                       
                                        else if(Reuse_count==5)
                                                
                                                else if(Reuse_count==6)
                                                        
                                                        else if(Reuse_count==7)
                                                               
                                                                else if(Reuse_count==8)
                                                                        
                                                                        else if(Reuse_count==9)
                                                                                
                                                                                else if(Reuse_count==10)
                                                                                       
                                                                                        else(Reuse_count==11)
                                                                                                                                                                                       
                                                                                                Reuse_count=0;
                                                                                       
}

void Reuse_time_sharing()
{
        switch(Reuse_count)
                case 1 : break;
                case 2 : break;
                case 3 : break;
                case 4 : break;
                case 5 : break;
                case 6 : break;
                case 7 : break;
                case 8: break;
                case 9 : break;
                case 10 : break;
                case 11 : Reuse_count=0;break;
        default;
}
在多分支的时候,有没有效率说法?


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:47286 发表于 2022-4-16 01:15 | 只看该作者
我认为有 但具体哪个效率高不好说 要请懂汇编且研究过这个的大侠了 以前我也问过这问题 多数人回答的也比较模糊

我的理解是 if和else if组合 不是if的时候 会尝试第一个else if 再不是就尝试第二个 一直下去 直到有匹配的 那么假如每次都是11 就是每次都要全走一遍

switch可能在底层有个类似表的东西 先匹配分支数 如果在范围内直接跳到对应分支 不在范围就走default

理论上多分支的时候switch快 但实际上不知道 因为我不知道假如真有这么个表一类的东西  去比较它开销有多大 仅编译长度而言 分支少用if编译结果小 分支多用switch编译结果小
回复

使用道具 举报

板凳
ID:624769 发表于 2022-4-16 03:16 | 只看该作者
先说一个小问题,
Reuse_count=0;
应该在 ++ 的函数里面重置,或者在 switch 的 default 里面重置, if 也是一样的道理。
你现在这样的写法, 后续会有很多隐患。

然后说一下,if, switch
执行效率来讲
如果,你都是连续数的话, switch  一定是优于 else if 的。
如果,非连续数,跳跃也没有规律的话,switch 和 else if 差不多, 但是优于纯 if, (这里说一下,你这里的判断,其实光用if 执行结果也没有区别但是效率的话,综合下来 else if 会高点)

编译后代码量而言,
看你选项多少,由于switch 需要建表,选项太少的话,switch 不划算。

可读性来讲,
个人觉得,只要选项超过3个,怎么看都是 switch 可读性更高。
回复

使用道具 举报

地板
ID:47286 发表于 2022-4-16 12:37 | 只看该作者
188610329 发表于 2022-4-16 03:16
先说一个小问题,
Reuse_count=0;
应该在 ++ 的函数里面重置,或者在 switch 的 default 里面重置, if  ...

为什么连续数switch比if高 我觉得应该是和有效条件的顺序有关吧 假如都是10个分支 有效分支2多 if就比switch高 有效分支10多 switch就比if效率高 如果没规律 那就是有效分支数小的多 if效率高 反之switch高 假如这个理解成立 用if的话把常用分支尽量往前写效率会高点 是么
回复

使用道具 举报

5#
ID:824490 发表于 2022-4-16 13:13 | 只看该作者
一直以来个人都是是这么铸的:并列if超过3个,建议用switch,
if 是每一个if都要判断一次符合了再执行,是顺序执行的,而switch只判断一次,就跳到对应的语句去执行。类似查表。
如果理解没错的话,switch从代码可读性、逻辑结构方面都比if强的多,当然,并列if少的话,差别可能不明显,所以才在“3条以上if 用switch”这个说法。
欢迎拍砖!
回复

使用道具 举报

6#
ID:677275 发表于 2022-4-16 14:17 | 只看该作者
可读性问题,没有效率之说
回复

使用道具 举报

7#
ID:1018878 发表于 2022-4-16 14:25 | 只看该作者
有时效果是一样的,根据情况而定
回复

使用道具 举报

8#
ID:401564 发表于 2022-4-16 15:14 | 只看该作者
个人感觉没有必要去管这个效率的
没有看过两个语句编译后的代码,但我敢肯定,这两者的效率相差绝对不会太大
在99.999%的情况下,用哪个都行,单纯的个人习惯而已
至少到现在为止,我没有碰到过非得用switch绝对不能用if,或者是非得用if而绝对不能用switch的情况
回复

使用道具 举报

9#
ID:491577 发表于 2022-4-16 15:23 | 只看该作者
这个有点钻牛角尖啦,现在单片机资源足够多,价格也足够便宜了,你觉得有可能用else if与switch其中一个单片机就可以运行,用另一个单片机就不可以运行吗?其实不需要纠结这个问题,你熟悉哪一个就用哪一个最终效果都一样。说到效率汇编更高,但是为什么用C的却比较多呢?主要是C更容易学,更多人熟悉。
回复

使用道具 举报

10#
ID:624769 发表于 2022-4-16 15:46 | 只看该作者
dzbj 发表于 2022-4-16 12:37
为什么连续数switch比if高 我觉得应该是和有效条件的顺序有关吧 假如都是10个分支 有效分支2多 if就比swi ...

刚才试了将近半个小时, 没有能够 “重现” (也许是KEIL版本,也许设置), 即:  没图没真相系列, 你或者其他人不信就当我胡说八道吧。
以下是我说的效率区别的基本差异点,你如果有幸“重现” 我当初的测试结果,希望能帮我存个图。
Switch 的选择,
当非连续的选择值的时候,是依据的 CJNE 来依次判断 跳转的,这个和  else if  编译后得到的结果是一样的。所以,这个时候, switch 仅仅是可读性高了。

当连续值选择的时候, switch 编译后 会 利用   JMP  @A+DPTR  来直接跳转到有效项。(这个我以前测试的时候出现过,前面想重现,始终编译不出来这个结果)  而这个跳转的效率 是远高于 CJNE 的依次判断跳转的。
不过,由于刚才始终重现不了这个编译结果,所以这个结论你就看看算了。就当switch 任何时候效率都和 else if 一样吧。
回复

使用道具 举报

11#
ID:382454 发表于 2022-4-16 16:26 | 只看该作者
else if一般喜欢用两个,而switch可以筛选好多个。
回复

使用道具 举报

12#
ID:47286 发表于 2022-4-16 21:44 | 只看该作者
188610329 发表于 2022-4-16 15:46
刚才试了将近半个小时, 没有能够 “重现” (也许是KEIL版本,也许设置), 即:  没图没真相系列, 你或者 ...

哦 收到 那我当效率一样吧 不管对错 你这回答是我看见的第一个肯定回答 上次我问的时候 得到的回答基本也都是不太确定 怎么说都有
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表