欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標題: C語言else if與switch怎么用比較合適?在多分支的時候,有沒有效率說法? [打印本頁]

作者: happy2058    時間: 2022-4-15 23:11
標題: C語言else if與switch怎么用比較合適?在多分支的時候,有沒有效率說法?
請教一下,謝謝大家

例如: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;
}
在多分支的時候,有沒有效率說法?



作者: dzbj    時間: 2022-4-16 01:15
我認為有 但具體哪個效率高不好說 要請懂匯編且研究過這個的大俠了 以前我也問過這問題 多數人回答的也比較模糊

我的理解是 if和else if組合 不是if的時候 會嘗試第一個else if 再不是就嘗試第二個 一直下去 直到有匹配的 那么假如每次都是11 就是每次都要全走一遍

switch可能在底層有個類似表的東西 先匹配分支數 如果在范圍內直接跳到對應分支 不在范圍就走default

理論上多分支的時候switch快 但實際上不知道 因為我不知道假如真有這么個表一類的東西  去比較它開銷有多大 僅編譯長度而言 分支少用if編譯結果小 分支多用switch編譯結果小
作者: 188610329    時間: 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 可讀性更高。

作者: dzbj    時間: 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的話把常用分支盡量往前寫效率會高點 是么
作者: 名字不是重點    時間: 2022-4-16 13:13
一直以來個人都是是這么鑄的:并列if超過3個,建議用switch,
if 是每一個if都要判斷一次符合了再執行,是順序執行的,而switch只判斷一次,就跳到對應的語句去執行。類似查表。
如果理解沒錯的話,switch從代碼可讀性、邏輯結構方面都比if強的多,當然,并列if少的話,差別可能不明顯,所以才在“3條以上if 用switch”這個說法。
歡迎拍磚!
作者: wangdanan    時間: 2022-4-16 14:17
可讀性問題,沒有效率之說

作者: 大臉盤子    時間: 2022-4-16 14:25
有時效果是一樣的,根據情況而定
作者: Y_G_G    時間: 2022-4-16 15:14
個人感覺沒有必要去管這個效率的
沒有看過兩個語句編譯后的代碼,但我敢肯定,這兩者的效率相差絕對不會太大
在99.999%的情況下,用哪個都行,單純的個人習慣而已
至少到現在為止,我沒有碰到過非得用switch絕對不能用if,或者是非得用if而絕對不能用switch的情況
作者: hhh402    時間: 2022-4-16 15:23
這個有點鉆牛角尖啦,現在單片機資源足夠多,價格也足夠便宜了,你覺得有可能用else if與switch其中一個單片機就可以運行,用另一個單片機就不可以運行嗎?其實不需要糾結這個問題,你熟悉哪一個就用哪一個最終效果都一樣。說到效率匯編更高,但是為什么用C的卻比較多呢?主要是C更容易學,更多人熟悉。
作者: 188610329    時間: 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 一樣吧。
作者: univers    時間: 2022-4-16 16:26
else if一般喜歡用兩個,而switch可以篩選好多個。
作者: dzbj    時間: 2022-4-16 21:44
188610329 發表于 2022-4-16 15:46
剛才試了將近半個小時, 沒有能夠 “重現” (也許是KEIL版本,也許設置), 即:  沒圖沒真相系列, 你或者 ...

哦 收到 那我當效率一樣吧 不管對錯 你這回答是我看見的第一個肯定回答 上次我問的時候 得到的回答基本也都是不太確定 怎么說都有




歡迎光臨 (http://m.raoushi.com/bbs/) Powered by Discuz! X3.1