幾乎所有程式語言都有條件判斷的語法,目的是為了讓電腦依照不同的情況做出不同的事情。
最簡單的形式如下:
if (條件式)
陳述
意思是當條件式為真的時候,就執行陳述。
條件式可以是 true/false,也可以是比較運算或邏輯運算的運算結果。總之,電腦會判斷 if 後面的判斷式為真還是假。執行看看下面的程式:
#include <iostream>
using namespace std;
int main() {
bool x = true;
if (x)
cout << "This is true!\n";
if (10 < 3)
cout << "10 < 3?\n";
if (3/2 == 1)
cout << "Do you know why?\n";
if (!x)
cout << "Lier!\n";
return 0;
}
應該會出現:
This is true!
Do you know why?
實際上,判斷式也可以放別的資料型態的變數/值,或是算術運算的結果。這是因為電腦會自動將其他資料型態的資料轉型成布林值的型態。這邊舉比較常用的例子。
整數: 0 會被轉型成 false,其他則為 true。
浮點數: 0.0 會被轉型成 false,其他則為 true。
也就是說,你可以用更簡短的程式來判斷算數運算的結果是否為 0。
舉例來說,下列的程式會判斷 x 和 y 是否皆為 0:
int x, y;
cin >> x >> y;
if (!x && !y)
cout << "Both x and y are 0.";
假如 if 有超過一行的陳述,就必須用大括號把陳述通通包起來,如:
if (true) {
cout << "First statement.\n";
cout << "Second statement.\n";
cout << "Third statement.\n";
}
每個 if 判斷式後面都可以接一個 else 判斷式,假如 if 的判斷式為假,電腦就會執行 else 的陳述。同樣的,如果陳述超過一行的話,需要用大括號包起來。如:
// Example 1
int x;
cin >> x;
if (x > 0)
cout << "x > 0\n";
else
cout << "x <= 0\n";
// Example 2
string str;
cout << "What programming language are you learning?\n";
cin >> str;
if (str == "C++") {
cout << "yes!!!\n";
}
else {
cout << str << "??\n";
cout << "Am I a joke to you?\n";
}
通常 if 跟 else 會同時使用大括號,或同時不使用。C++ 並不會強制你這樣做,這只是大家寫程式的習慣而已。
注意: if 跟 else 的陳述只會有一個會被執行到。假如 if 的判斷式為真,在執行完對應的陳述後,電腦就會跳過 else 的部分,繼續執行下去。
下面是一些 if、else 的範例程式。
範例1: 輸入一個數,印出它的絕對值:
int num;
cin >> num;
if (num < 0)
cout << -num;
else
cout << num;
範例2: 輸入兩個相異的數,印出比較大的數:
int x, y;
cin >> x >> y;
if (x > y)
cout << x;
else
cout << y;
範例3: 輸入兩個非 0 的數,判斷它們之間是否存在倍數關係:
int x, y;
cin >> x >> y;
if (x > y)
cout << (x % y == 0);
else
cout << (y % x == 0);
在 if 跟 else 之間可以插入一個或多個 else if 來進行更細緻的判斷。else if 跟 if 一樣也具有判斷式跟陳述,程式結構如下:
if (判斷式1)
陳述1
else if (判斷式2)
陳述2
else if (判斷式3)
陳述3
else
陳述4
電腦會從 if 開始逐一判斷,一旦遇到判斷式為真的 if 或 else if,就會執行對應的陳述,執行完後就會跳過所有其他的判斷式和陳述。也就是說,只會有一個陳述被執行到。
下面的程式會判斷兩個數字誰比較大,或是一樣大:
int x, y;
cin >> x >> y;
if (x > y)
cout << x << " > " << y;
else if (x < y)
cout << x << " > " << y;
else
<< x << " = " << y;
下面的程式會依照分數的高低,給予對應的回答:
int grade;
cout << "What is your grade?\n";
cin >> grade;
if (grade >= 90)
cout << "wow! good job!\n";
else if (grade < 90 && grade >= 60)
cout << "Not bad!\n";
else
cout << "Oops!\n";
if、else if 和 else 其實也是陳述的一種,因此你可以在 if、else if 或 else 的陳述中,加入更多 if、else if 和 else! 這種架構稱為「巢狀」(nested)。
下面的程式會判斷兩個數字誰比較大,或是一樣大:
int x, y;
cin >> x >> y;
if (x > y)
cout << x << " > " << y;
else {
if (x < y)
cout << x << " < " << y;
else
cout << x << " = " << y;
}
這個例子跟前面 else if 判斷式的第一個範例是相同的,差別只在這個寫法比較醜~ 如果可以的話盡量使用 else if,程式看起來會比較整齊好讀。
下面是另一個更醜的程式: 除了會依照分數的高低,還會依照社會的刻板印象給予回答。使用不同的輸入組測試看看 (僅作為教學用途,通常不會把程式寫得這麼醜)。
注意: 輸入資料給布林變數的時候,要輸入 1 (真) 或是 0 (假),輸入 true 或 false 的話會被當成字串。
int grade;
bool isAsian;
cout << "What is your grade?\n";
cin >> grade;
cout << "Are you Asian?\n";
cin >> isAsian;
if (grade >= 90) {
if (isAsian)
cout << "This is your job!\n";
else
cout << "wow! good job!\n";
} else if (grade < 90 && grade >= 60) {
if (isAsian)
cout << "No dinner tonight!\n";
else
cout << "Not bad!\n";
} else {
bool isLegal;
cout << "Is abandoning kids legal in your country?\n";
cin >> isLegal;
if (isAsian && !isLegal)
cout << "I wish i can abandon you, but its illegal!\n";
else if (isAsian)
cout << "(your abandoned...no response...)\n";
else
cout << "Oops!\n";
}
可以在 if、else if、else 的大括號中撰寫各式各樣的陳述,包含宣告新的變數。在上面的例子中,最外層的 else 在大括號內宣告了 isLegal
。
可以利用這個手法將變數宣告在它被使用的地方附近,假如 isLegal
宣告在 isAsian
的下面一行,會讓讀程式碼的人需要掃描更大的區域才能理解程式的行為。
注意: 大括號還具有劃分「可視範圍」的作用,變數被宣告以後,只能被相同範圍 (同一組大括號內) 或是目前範圍中的其他範圍 (目前的大括號內的其他大括號) 內的陳述使用。
以上述的程式來說,23 行的 cin 和宣告在 21 行的 isLegal 屬於相同的範圍,所以可以使用 isLegal。而 24 行的陳述所屬的範圍在第 2 行的 isAsian 所屬的範圍之內,所以可以使用 isAsian。這部分的內容在之後會專門寫一篇來解釋。
同樣的程式,也可以寫成下面的形式: 把是不是亞洲人的這個判斷拉到最外層的判斷式,內層的判斷式則是依照不同的分數給出不同的回應。雖然還是很醜,但應該比上面的好讀一些。
int grade;
bool isAsian;
cout << "What is your grade?\n";
cin >> grade;
cout << "Are you Asian?\n";
cin >> isAsian;
// Asian part
if (isAsian) {
if (grade >= 90)
cout << "This is your job!\n";
else if (grade < 90 && grade >= 60)
cout << "No dinner tonight!\n";
else {
bool isLegal;
cout << "Is abandoning kids legal in your country?\n";
cin >> isLegal;
if (!isLegal)
cout << "I wish i can abandon you, but its illegal!\n";
else
cout << "(your abandoned...no response...)\n";
}
} else { // non Asian part
if (grade >= 90)
cout << "wow! good job!\n";
else if (grade < 90 && grade >= 60)
cout << "Not bad!\n";
else
cout << "Oops!\n";
}
switch 跟 if、else if、else 很類似,結構如下:
switch(變數或運算式) {
case 值1:
陳述1-1;
陳述1-2;
break;
case 值2:
陳述2-1;
陳述2-2;
break;
default:
陳述3-1;
陳述3-2;
}
電腦會拿 switch 小括號內的變數或運算式的結果,去比對每個 case 後面的值,如果相等的話,就會執行 case 下面的陳述。每個 case 都可以有多個陳述。
如果沒有任何 case 的值匹配的話,就會執行 default 的陳述。
注意到每個 case 的最後一個陳述下面,有一個特殊的陳述: break;
。
執行到 break 的時候,電腦就會跳到 switch 外面,剩下的都不會被執行到。
下面的程式會依照 x 的值印出對應的字串。由於每個 case 中都加了 break,因此不論 x 的值為何,每次執行的時候都只會有一行字串被印出來。
int x = 0;
cin >> x;
switch(x) {
case 1:
cout << "One\n";
break;
case 2:
cout << "Two\n";
break;
case 3:
cout << "Three\n";
break;
default:
cout << "Default\n";
}
假如匹配到的 case 中沒有 break 的話,在執行完那個 case 的陳述後,電腦會繼續往下執行下一個 case 的陳述,直到遇到 break 或是執行完所有 switch 中的陳述 (包含 default 的陳述)。
下面的程式將上個例子的 break 全部拿掉了,輸入不同的值觀察結果:
int x = 0;
cin >> x;
switch(x) {
case 1:
cout << "One\n";
case 2:
cout << "Two\n";
case 3:
cout << "Three\n";
default:
cout << "Default\n";
}
假如要在 case 的陳述中宣告變數且初始化的話,必須用大括號把變數宣告以及會使用到變數的陳述包起來,如:
int x = 0;
cin >> x;
switch(x) {
case 1:
{
int y = 0;
cin >> y;
cout << "One plus " << y << '\n';
}
break;
case 2:
cout << "Two\n";
break;
case 3:
cout << "Three\n";
break;
default:
cout << "Default\n";
}
這篇介紹了兩種條件判斷的寫法: if、else if、else 以及 switch。
if、else if、else:
{}
包起來。switch:
// Example 1
if (x > y)
cout << "x > y\n";
else
cout << "x <= y\n";
// Example 2
if (x > y)
cout << "x > y\n";
cout << "x <= y\n";