if-else 是二選一的流程控制指令,當程式必須做多選一的情形,可以採用 switch 指令。 雖然我們也可以用連續判斷式的 else-if 來做多重選擇,但在選擇專案太多的情形下,畢竟沒有 switch 來得方便。 switch 的寫法是:
switch(條件式) { case 條件值 1: { 動作 1 } break; case 條件值 2: { 動作 2 } break; case 條件值 3: { 動作 3 } break; : : default : { 動作 n } //所有條件都不成立時,執行動作 n break; }
其中每個動作 ( 無論是單一或複合敘述 ) 的左右大括弧均可以省略。 例如我們要由鍵盤讀取一個按鍵,然後依此按鍵的值採取不同的動作:
switch(getch()) { case 'a':cout<<"Add.\n"; break; case 'u':cout<<"Update.\n"; break; case 'd':cout<<"Delete.\n"; break; default :cout<<"Input Error!\n"; break; }
switch 內的條件式其結果必須是整數或字元。 switch 以算式的運算結果來與各 case 的條件值比對,如果與某個條件值相符,則執行該 case 所指定的動作。 若所有條件值都不符合,則執行 default 所指定的動作 ( 即上例的動作 n )。
case 可以不按照條件值的大小排列,但每個動作之後的 break 是必須的,因為 switch 在執行 case 的動作時,是一直執行到 break 才會停止。 比如說我們的運算結果與條件值 2 相符,若動作 2 之後不加 break,則程式會接著執行動作 3、動作 4,直到碰到 break 或 switch 敘述的結束為止。 除非是我們刻意的安排,否則這種情形就會造成錯誤的結果,我們稱這種流程的結構為 falling through。 如果我們把上例中每個case的 break 都去掉,就會產生錯誤的結果:
switch(getch()) //從任何一點進入都會執行到底 { case 'a':cout<<"Add.\n"; case 'u':cout<<"Update.\n"; case 'd':cout<<"Delete.\n"; default :cout<<"Input Error!\n"; }
此時無論由哪個 case 進入執行,都會往下執行每個 case 的動作,結果自然不正確。 另外請注意! case 的條件值必須是資料常數而不可以是變數,並且每個case的條件值必須是唯一而沒有重複的。
☛ break
其實 case 只不過是和標名一樣的東西,所以進入某個 case 後,便會往下一直執行,如果要停止這種 falling through 的情形,一定要使用 break 來跳出 switch。
break 是跳出回圈的指令,即 jump out of inner loop,任何由 switch 或 for、while、do-while 所構成的回圈,皆可用 break 來跳出。 不過 break 一次只能跳出一層回圈,這是 break 的限制。
使用 switch 時,雖然不加 break 可能造成錯誤,但是若有數種 case 其所動作均一樣時,我們倒是可以使用這種 falling through 的寫法,例如前例中,我們可以加上大寫輸入的檢測:
switch(getch()) { case 'A': case 'a':cout<<"Add.\n"; break; case 'U': case 'u':cout<<"Update.\n"; break; case 'D': case 'd':cout<<"Delete.\n"; break; default :cout<<"Input Error!\n"; break; }
☛ default
當 switch 的運算結果與所有 case 值都不符時,我們可以有一種選擇,即 default。 default 類似於 if 敘述中的 else,就是當所有 case 都不成立時就執行 default 所指定的動作。 上例程式就是以 default 來檢查錯誤的按鍵,並印出錯誤警告。 default 與else一樣不一定要使。 雖然 default 大都放在最後,但請記得 switch 的所有 case 次序是可以隨便放的,所以也可以放在 default 之後,使用 default 時最好也在動作之後加上 break,免得以後再補上 case 時,造成一個不易發現的錯誤。