關於兩者的優缺點如下:
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比較靈活。