switch和if相關內容總結

第一個問題:switch和if else的區別:

switch...case與if...else的根本區別在於,switch...case會生成一個跳轉表來指示實際的case分支的地址,而這個跳轉表的索引號與switch變量的值是相等的。從而,switch...case不用像if...else那樣遍歷條件分支直到命中條件,而只需訪問對應索引號的表項從而到達定位分支的目的。

具體地說,switch...case會生成一份大小(表項數)爲最大case常量+1的跳錶,程序首先判斷switch變量是否大於最大case 常量,若大於,則跳到default分支處理;否則取得索引號爲switch變量大小的跳錶項的地址(即跳錶的起始地址+表項大小*索引號),程序接着跳到此地址執行,到此完成了分支的跳轉。

switch...case只能處理case爲常量的情況,對非常量的情況是無能爲力的。

第二個問題:switch不加break時爲什麼具有連通性:

case後面的常量表達式實際上只起語句標號作用,而不起條件判斷作用,即"只是開始執行處的入口標號". 因此,一旦與switch後面圓括號中表達式的值匹配,就從此標號處開始執行,而且執行完一個case後面的語句後,若沒遇到break語句,就自動進入下一個case繼續執行,而不再判斷是否與之匹配,直到遇到break語句才停止執行,退出break語句.因此,若想執行一個case分之後立即跳出 switch語句,就必須在此分支的最後添加一個break語句.

第三個問題:switch和if else的效率誰比較高:

在第一個問題中我們提到由於跳轉表的存在從而,switch...case不用像if...else那樣遍歷條件分支直到命中條件,而只需訪問對應索引號的表項從而到達定位分支的目的。當分支較多時,用switch的效率是很高的。因爲switch是隨機訪問的,就是確定了選擇值之後直接跳轉到那個特定的分支,但是if  else是遍歷所以得可能值,知道找到符合條件的分支。如此看來,switch的效率確實比ifelse要高的多。

switch...case佔用較多的代碼空間,因爲它要生成跳錶,特別是當case常量分佈範圍很大但實際有效值又比較少的情況,switch...case的空間利用率將變得很低。switch只能是在常量選擇分支時比ifelse效率高,但是if  else能應用於更多的場合,if  else比較靈活。

總結:在多條件分支選擇的情況下使用switch比if else效率高,但是switch語句沒有if else語句靈活。




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章