除了嵌套 if-else 語句外,我們還可以根據一個順序數據類型算式的值,使用 switch 語句作出多重選擇。
C++ 控制結構 | 等同的 Turbo Pascal 控制結構 |
switch (<順序數據類型算式>) { case <值1>: <情況1的語句1>; <情況1的語句2>; ... <情況1的語句n>; break; case <值2>: <情況2的語句1>; <情況2的語句2>; ... <情況2的語句n>; break; ... default: <預設情況的語句1>; <預設情況的語句2>; ... <預設情況的語句n>; } |
case <順序數據類型算式>
of <值1>: begin <情況1的語句1>; <情況1的語句2>; ... <情況1的語句n> end; <值2>: begin <情況2的語句1>; <情況2的語句2>; ... <情況2的語句n> end; ... else (* 只在 Turbo Pascal 支援 *) <預設情況的語句1>; <預設情況的語句2>; ... <預設情況的語句n> end |
在這個控制結構中,case <值>: (C++ 中)及 <值>: (Pascal 中)是情況標記。<順序類型結構算式> 會先被計算,那些對應回傳值的語句會被執行,而其他的會被忽略。當回傳值並沒有在任何一個情況出現時,預設情況(C++ 的 default 或 Pascal 的 else)的語句會被執行。請看看以下程序
C++ 版本 | Pascal 版本 |
#include <iostream.h> main() { char grade; cout << "Grade: "; cin >> grade; switch (grade) { case 'A': case 'B': cout << "Good!" << endl; break; case 'C': cout << "Average." << endl; break; case 'D': cout << "Fair." << endl; break; case 'F': cout << "Poor." << endl; break; default: cout << "Invalid grade!" << endl; } return 0; } |
program prog_14(input, output); var grade: char; begin write('Grade: '); readln(grade); case grade of 'A', 'B': writeln('Good!'); 'C': writeln('Average.'); 'D': writeln('Fair.'); 'F': writeln('Poor.'); else writeln('Invalid grade!') end end. |
輸出範例一(紅色的文字由使用者輸入)︰ | |
Grade: C Average. |
|
輸出範例二(紅色的文字由使用者輸入)︰ | |
Grade: X Invalid grade! |
在 C++ 中,如果 <順序數據類型算式> 回傳的值和情況標記的任何一個 <值> 吻合,那麼由該標記到 break 語句之間的所有語句皆會執行。因此你會發現在下一個情況標記之前都有一個 break 語句。如果沒有了這個 break 語句的話,你可能能會得到非預期的結果。參與以下程序作為例子,它和上面的程序差不多相同,分別只是下面的程序漏了一個 break 語句。
#include <iostream.h> main() { char grade; cout << "Grade: "; cin >> grade; switch (grade) { case 'A': case 'B': cout << "Good!" << endl; break; case 'C': cout << "Average." << endl; // 漏了一個 break 語句。 case 'D': cout << "Fair." << endl; break; case 'F': cout << "Poor." << endl; break; default: cout << "Invalid grade!" << endl; } return 0; } |
輸出範例(紅色的文字由使用者輸入)︰ |
Grade: C Average. Fair. |
從上面的輸出範例,可以見到當等級是「C」的時候,「Average.」及「Fair.」皆在畫面上出現。這是因為顯示「Average.」的語句之後沒有 break 語句,所以下一句(即顯示「Fair.」那一句)都被執行。