- 摩刻部落 - https://www.moke.tw/wordpress -

基礎程式設計(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 有些致命的缺點(個人觀點),請看下面的注意事項:

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 強大很多,我們來看看它的不同:

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