基礎程式設計(7)-switch/select case條件控制

條件控制除了 if/else 外,還有另一種”多選一”的條件控制,在 C 風格的程式語言中使用 switch case,而在 BASIC 風格的程式語言中則是使用 Select Case,兩者有些差異,不過基本概念是相同的。本篇先用 C 風格語言介紹基本概念,再說明 BASIC 語言的不同之處。

switch case (適用於C/C++/Java)

當一件事情有好幾種可能的結果時,就可以考慮使用 switch/select case 的方式來完成。舉例來說,學生的成績不同,可以獲得不同等第。以程式的角度來看,使用 if/else 語法可以寫成這個樣子:

int score = 75;
int level = score / 10;

if(level == 10 || level == 9) {
    //成績 A
}
else if(level == 8) {
    //成績 B
}
else if(level == 7) {
    //成績 C
}
else if(level == 6) {
    //成績 D
}
else {
    //成績 E (不及格)
}

上面的程式碼如果換成 switch case 就會變成:

int score = 75;
int level = score / 10;

switch (level) {
    case 10 :
    case 9 :
        //成績 A
        break;
    case 8 :
        //成績 B
        break;
    case 7 :
        //成績 C
        break;
    case 6 :
        //成績 D
        break;
    default:
        //成績 E (不及格)
}

首先要說明的是第 2 行的 level,由於 int 為整數,因此 score 除以 10 之後再指定給 level 只會留下商數,也就是 0-10 之間的數字。第 4 行 switch 括號裡面放的就是我們要判斷的變數,第 5 行開始的 case 後面放的就是判斷的值。當 score = 75 時,level = 7,所以遇到第 4 行的 switch 語法會直接進入 12 行的 case 7,執行 13 行的程式。到了第 14 行碰到強制跳出的 break 語法(後面章節會介紹),所以直接跳出 switch,從 21 行繼續執行。

我們可以把每一個 case 語法當作一扇門,變數(level)值將會決定我們要從那一扇門進入,也就是從那一行程式開始執行。如果沒有寫 break 語法的話,程式就會繼續執行下去而不會跳出 switch。所以 case 10 和 case 9 都是成績A,直到碰到第 8 行的 break 才會跳出敘述。另外,第 18 行的 default 則是當上面沒有一個 case 符合時所要執行的內容。

改成 switch case 的好處是 level 只需要讀取一次,在效能上是比較好的(雖然實際上差不了多少)。還有 switch 會比 if/else 更容易閱讀,可讀性比較高。但是 switch case 有些致命的缺點(個人觀點),請看下面的注意事項:

  • switch 後面可以接變數或運算式,判斷的型態只能是 int(整數) 或是 char(字元),字元使用單引號(‘)括起來。
  • 每一個 case 相當於 == 的敘述,無法使用大於、小於等其它比較運算子,且 case 後面只能有一個值。

Select Case (適用於VB.NET)

上面的程式可以改成 BASIC 語言如下:

Dim score As Integer = 75
Dim level As Integer = score \ 10

Select Case level
    Case 9, 10
        '成績 A
    Case 8
        '成績 B
    Case 7
        '成績 C
    Case 6
        '成績 D
    Case Else
        '成績 E (不及格)
End Select

首先看到的第一個不同處是 Select Case 不需要加入 Break 敘述,進入 Case 執行完後會自動跳出 Select。第二個不同點是第 5 行的 Case 後面有二個值,level 等於 9 或 10 的時候都是成績 A。事實上 BASIC 語言的 Select Case 比 switch case 強大很多,我們來看看它的不同:

  • Select Case 後面可以接變數或運算式,型態為基礎資料型別(Boolean、Byte、Char、Date、Double、Decimal、Integer、Long、Object、SByte、Short、Single、String、UInteger、ULong 和 UShort)。
  • Case 後面可以接好幾個”運算式子句”,每個子句之間以逗號(,)分隔,包含三種形式:
  • 常數:如果只有一個常數,表示進行等於(=)的比較運算。
  • Is 比較運算子 值:Is 搭配大於、小於等比較運算子使用,判斷變數是否符合。
    例如可將上面程式第 5 行改成「Case Is >= 9」,表示 level 大於等於 9 就執行第 6 行敘述。
  • 下界值 To 上界值:使用 To 來指定一個範圍,下界值必須小於等於上界值。
    例如上面程式第 5 行可改成「Case 9 To 10」,表示 level 若介於 9 和 10 之間,就執行第 6 行敘述。

由於 switch case 和 Select Case 有許多不同之處,所以實際使用時會產生不同的應用。