if else 和 switch case 總結


關於兩者的優缺點如下:

1.if else的優缺點

  缺點:效率低(相對於switch)

  優點:使用靈活,代碼空間小

2.switch的優缺點

   缺點:不夠靈活,switch僅支持 int,char,unsigned char 等基本類型;代碼空間大。

   優點:代碼結構清晰,效率高

其實,對於if else 作為關鍵字而言,效率還是可以的。

下面是一個比較權威的說法:

《C++ Footprint and Performance Optimization》的7章,第一節。
然后根據大量的實際程序測試(不考慮不同的編譯器優化程度差異,假設都是最好的優化),那么Switch語句擊中第三個選項的時間跟if/else if語句擊中第三個選項的時間相同。
擊中第一,第二選項的速度if語句快,擊中第四以及第四之后的選項的速度switch語句快。

 

switch底層執行原理     

   switch語句根據一個整數索引值進行多重分支,底層采用跳轉表這種數據結構。跳轉表是一個數組,表項 i 對應代碼段的地址,當switch索引值等於表項i時采取對應的程序操作。

簡單可理解為:執行switch時生成一個長度為最大case常量+1的數組,程序首先判斷switch變量是否大於最大case 常量,若大於,則跳到default分支處理;否則取得數組索引號為switch變量值大小,取得數組對應值即為相應case代碼塊地址,程序接着跳到此地址執行,完成分支的跳轉。

 

 對於if-else,在系統是自上而下逐個條件去判斷,直到命中;所以應將機率大的條件置於最前面。以下給出一個簡單例子

 

var random = Math.random()*100;//生成0-100的隨機數
if(random > 10){ //90%

}else if(random > 5){//5%

}else{//剩下的5%

}

 

對於條件機率相等或是條件個數非常多的情況,因為switch的執行時間與條件數量無關,他是根據switch值直接跳轉到對應分支,所以可以選擇switch代替if-else。

var random = Math.random() * 100;// 生成0-100的隨機數
   switch (random) {
    case 0:
        break;case 100:
        break;
   }

 

 

對於switch,實際上是根據case最小值與最大值,維系了一段連續的內存空間,以空間換取時間。以下給出一個簡單的反例,最大值與最小值跨度較大,且之間沒有更多的條件情況,那個無疑實際申請的很多空間是沒用的,所以就應考慮使用if-else在代替。

總結:.switch...case只能處理case為常量的情況,對非常量的情況是無能為力的。例如 if (x > 1 && x < 100),是無法使用switch...case來處理的。所以,switch只能是在常量選擇分支時比ifelse效率高,但是ifelse能應用於更多的場合,ifelse比較靈活。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM