iT邦幫忙

2022 iThome 鐵人賽

DAY 9
0
Software Development

程式基礎概念討論系列 第 9

[DAY 9] 把所有可能全都列出來的條件陳述式 (下): switch 陳述式

  • 分享至 

  • xImage
  •  

昨天,我們討論了條件陳述式中最常被使用的 if-else 陳述式,而今天我們則會討論另一種條件陳述式,switch 陳述式 (Switch Statement)

switch 陳述式

switch 陳述式的概念是透過等於比較某個指定的變數或運算式並根據該變數或運算式的值來決定要執行什麼的指令。它的做法就像是早期的網址路徑一樣,頁面會根據網址後面的部分而改變,例如 (網址)/index.html 為主頁面、(網址)/welcome.html 為歡迎頁面、(網址)/introduction.html 為介紹頁面等。由於 switch 陳述式包含了進行等於比較變數或運算式的動作,因此它跟 if-else 陳述式不同,可以使用任何資料型態的變數。可是相對的,switch 陳述式每次只能有一項用來比較的變數或運算式,而無法像 if-else 陳述式一樣同時使用多項資料為同一項的條件。

switch 陳述式的基本架構如下:

switch 變數/運算式:
    case 變數/運算式回傳的值為值 A 時:
        執行 指令組 (陳述式) A
        break
    case 變數/運算式回傳的值為值 B 時:
        執行 指令組 (陳述式) B
        break
    case 變數/運算式回傳的值為值 C 時:
        執行 指令組 (陳述式) C
        break
    ...
    default:(變數/運算式回傳的值並未被列出時)
        執行 指令組 (陳述式) X
        break

從它的架構來看,我們可以看到 switch 陳述式的幾個重點:

  1. 使用 switch 關鍵字來指定進行等於比較的變數或運算式

  2. 使用 case 關鍵字來列出被等於比較的變數或運算式可能的值
    從這一點來看,當我們使用 case 關鍵字列出了一個該變數或運算式的可能的狀況 (下文簡稱為 case)時,就等於寫出 if (變數/運算式) == (可能的值) 的意思。

  3. 在 case 中執行的指令後會使用 break 關鍵字來進行打斷
    break 關鍵字是用來告訴程式需要執行的指令組的結束,而實際上即使我們沒有使用 break 關鍵字,大多數的程式語言還是能夠不受影響繼續執行下去,可是它會從所屬的 case 開始把所有的指令組全部執行一遍。舉例來說,在上述架構的例子中,如果變數/運算式回傳的值為值 B 而我們沒有使用 break 關鍵字時,程式會自動執行從指令組 (陳述式) B 開始到指令組 (陳述式) X 的所有指令。這個特性在擁有一些需要執行相同指令的 case 時非常有用。

  4. 使用 default 關鍵字來處理變數或運算式回傳的值不屬於被列出的任何一個 case 時的狀況
    從這一點來看,default 關鍵字實際上就是等同於 if-else 陳述式中的 else 的部分。

以下是一個使用 switch 來根據分數去回饋成績的例子:[Java]

import java.util.Scanner;

public class SwitchExample {
    public static void main(String args[]) {
        Scanner scanner = new Scanner(System.in);
        System.out.print("請輸入你的分數:"); // 顯示:"請輸入你的分數:"
        int score = scanner.nextInt(); // 接收使用者所輸入的分數
        
        switch(score / 10) { // 使用 switch 陳述式並指定了 score / 10 為比較的對象,由於變數為 int,因此在 java 中小數的部分會被直接捨棄,只保留了整數的部分
            case 9: // 當 score / 10 == 9 [90 - 99] 時, 由於顯示的文字跟 score / 10 == 10 時相同,因此我們故意不使用 break 關鍵字來讓程式執行 case 10 的內容
            case 10: // 當 score / 10 == 10 [100] 時
                System.out.println("你的成績是 A!"); // 顯示:"你的成績是 A!"
                break; // 我們不希望程式執行下面的 case 的內容,因此使用 break 關鍵字進行打斷
            case 8: // 當 score / 10 == 8 [80 - 89] 時
                System.out.println("你的成績是 B!"); // 顯示:"你的成績是 B!"
                break; // 使用 break 關鍵字進行打斷
            case 7: // 當 score / 10 == 7 [70 - 79] 時
                System.out.println("你的成績是 C!"); // 顯示:"你的成績是 C!"
                break; // 使用 break 關鍵字進行打斷
            case 6: // 當 score / 10 == 6 [60 - 69] 時
                System.out.println("你的成績是 D!"); // 顯示:"你的成績是 D!"
                break; // 使用 break 關鍵字進行打斷
            default: // 否則:當 score 少於 60 時
                System.out.println("你的成績是不及格!"); // 顯示:"你的成績是不及格!"
                break; // 使用 break 關鍵字進行打斷
        }
        // 當 switch 陳述式中使用 break 關鍵字進行打斷程式會自動跳到這個位置
    }
}

if-else 陳述式 vs switch 陳述式

那我們什麼時候該使用 if-else 陳述式、什麼時候該使用 switch 陳述式呢?首先,就讓我們來看看它們分別的優勢吧:

if-else 陳述式

  1. if-else 陳述式所使用的條件可以接納多個變數或運算式,也不會被限制為等於比較的狀況,這讓我們使用 if-else 來列出可能的狀況時有不少的彈性 (像是需要進行其他的比較方式,如大於或小於時)

switch 陳述式

  1. switch 陳述式所使用的變數或運算式回傳的值可以為不同的資料型態
  2. switch 陳述式可以透過控制使用 break 關鍵字來讓不同的狀況有著相同的指令的部分不用重複編寫的好處
  3. 一般認為,在 case 很多的情況下,使用 switch 陳述式會比 if-else 陳述式更有效率,這是因為 switch 陳述式是以跳轉的方式運行,它會把不乎合的 case 的程式碼直接跳過;而 if-else 陳述式則是會一行一行的把所有 if 跟 else if 的部分進行確認。

由此可見,if-else 陳述式是以較靈活的通用性為目的而設計的通用型架構,而 switch 陳述式則是以針對單項變數或運算式有多個可能的狀況時所設計的特化型架構。因此,如果我們面對單項變數或運算式有多個可能的狀況時,switch 陳述式會明顯地比 if-else 陳述式更適合被使用。但在大多數的狀況下,if-else 陳述式則會比 switch 陳述式更適合被使用。

延伸討論:通用型架構與特化型架構

if-else 陳述式與 switch 陳述式的比較可以說是展示了一般通用型架構跟特化型架構之間的差別,不過,是不是就代表通用型架構就會比特化型架構更好呢?這並不一定,就像是這次的例子一樣,特化型架構在它們乎合所針對的狀況下使用時往往都能比通用型架構有更好的表現與發揮。因此我們可以在考慮及評估可能會面對的狀況後再挑選使用通用型架構還是特化型架構的程式碼,這一點在我們後期開始需要自行建構及設計程式的架構時是必須要考慮的。


上一篇
[DAY 8] 視情況而決定的條件陳述式 (上): if-else 陳述式
下一篇
[DAY 10] 讓重複的事情不用一提再提的迴圈陳述式 (上):while 迴圈
系列文
程式基礎概念討論30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言