久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1969|回復: 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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 一区二区久久 | 久久久女女女女999久久 | 久久99视频精品 | 欧美日韩中文字幕 | 久久久999精品 | 日韩精品一区二区三区久久 | 夜夜爽99久久国产综合精品女不卡 | 看毛片的网站 | 久久久久亚洲精品 | 成人午夜免费视频 | 亚洲精品久久久久久久久久久久久 | 台湾佬久久 | 黄色一级大片在线免费看产 | 一级高清视频 | 成人婷婷 | 国产九九九九 | 欧美日韩国产精品一区二区 | 国产一区影院 | 日韩精品久久一区二区三区 | 亚洲色欧美另类 | 91精品91久久久 | 成年免费大片黄在线观看一级 | 波多野结衣一区二区 | 亚洲精选一区 | 国产日韩中文字幕 | 亚洲一区在线日韩在线深爱 | 91免费看片| 欧美一a | 美女国产 | 奇米av | 精品国产不卡一区二区三区 | 欧美成人激情视频 | 国产乱码精品一区二区三区五月婷 | 狠狠操狠狠干 | 国产视频三级 | 免费一区二区三区在线视频 | 国产日韩一区二区三免费 | 中文二区 | 日韩久久久久久 | 日本粉嫩一区二区三区视频 | 91精品国产色综合久久不卡98口 |