無痛入手 C++:基礎教學5 - 條件判斷

更新 發佈閱讀 19 分鐘

幾乎所有程式語言都有條件判斷的語法,目的是為了讓電腦依照不同的情況做出不同的事情。​

If 判斷式

最簡單的形式如下:

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";
}


Else 判斷式

每個 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);


else if 判斷式

在 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 條件判斷

switch 跟 if、else if、else 很類似,結構如下:

switch(變數或運算式) {
case1:
陳述1-1;
陳述1-2;
break;
case2:
陳述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:

  1. 電腦在遇到 if、else if 的時候,會檢查條件式,如果為真的話就會執行對應的陳述,執行完後就會跳過所有後面的條件式以及陳述。如果所有的條件式皆為假,就會執行 else 的陳述。
  2. 如果有多行陳述的話,需要用大括號 {} 包起來。
  3. 大括號內可以撰寫各種陳述,包含宣告新的變數。
  4. 整數 0 和浮點數 0.0 會被自動轉型成布林值的假,其他數值則會被轉型為真。

switch:

  1. 電腦會拿變數或運算結果的值去配對不同的 case,配對到以後就會執行對應的陳述。
  2. 執行到 break 的話,電腦會跳出 switch,從 switch 外面的第一行程式繼續執行。如果沒有遇到 break,電腦會繼續往後執行,直到遇到 break 或是執行完 switch 內的所有陳述。
  3. 假如要在 case 的陳述中宣告變數且初始化的話,必須用大括號把變數宣告以及會使用到變數的陳述包起來。

習題

  1. 下列的兩個例子差別在哪? 什麼時候需要加 else,什麼時候不需要呢?
// 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";
  1. 輸入一個月份,並依照月份印出是哪個季節。用 if、else if、else 以及 switch 各寫一個版本。
  2. 輸入一個數字,並判斷該數字是否可以被 2、3、5 整除,並分別印出對應的字串,舉例來說: 假如輸入 4 的話,應該要印出 can be divided by 2;假如輸入 15 的話,應該要印出 can be divided by 3 以及 can be divided by 5;依此類推,假如輸入 60 的話,就是三個都要印出來。


應用

猜拳遊戲


留言
avatar-img
鏟薯員的窩
9會員
14內容數
程式設計 & 電腦系統 & 系統軟體
鏟薯員的窩的其他內容
2024/05/05
C 語言的函式庫定義了許多好用的函式,在寫 C++ 的時候可以拿來用。這是因為 C++ 當初在設計的時候,就有刻意把 C 涵蓋進來。 基本用法 首先要導入 C 語言的標準函式庫: #include <cstdlib> 以 c 作為開頭表示它是 C 語言的函式庫,只是被我們拿來 C++ 的程式
Thumbnail
2024/05/05
C 語言的函式庫定義了許多好用的函式,在寫 C++ 的時候可以拿來用。這是因為 C++ 當初在設計的時候,就有刻意把 C 涵蓋進來。 基本用法 首先要導入 C 語言的標準函式庫: #include <cstdlib> 以 c 作為開頭表示它是 C 語言的函式庫,只是被我們拿來 C++ 的程式
Thumbnail
看更多
你可能也想看
Thumbnail
本文是C#入門教程的一部分,涵蓋了流程控制的各種語句與迴圈。這包括if、else if和else語句,三元運算子,switch語句,以及for、foreach和while迴圈。文中還介紹了如何在迴圈中使用break、continue、return和goto語句。
Thumbnail
本文是C#入門教程的一部分,涵蓋了流程控制的各種語句與迴圈。這包括if、else if和else語句,三元運算子,switch語句,以及for、foreach和while迴圈。文中還介紹了如何在迴圈中使用break、continue、return和goto語句。
Thumbnail
此章節的目的是介紹Java程式語言中的流程控制結構,包括條件語句(if, else if, else)、三元運算子、switch語句,以及各種迴圈(for, foreach, while)。同時,也解釋了如何在迴圈中使用控制語句來改變程式的執行流程。每種主題都配有示例程式碼以幫助理解。
Thumbnail
此章節的目的是介紹Java程式語言中的流程控制結構,包括條件語句(if, else if, else)、三元運算子、switch語句,以及各種迴圈(for, foreach, while)。同時,也解釋了如何在迴圈中使用控制語句來改變程式的執行流程。每種主題都配有示例程式碼以幫助理解。
Thumbnail
5 月將於臺北表演藝術中心映演的「2026 北藝嚴選」《海妲・蓋柏樂》,由臺灣劇團「晃晃跨幅町」製作,本文將以從舞台符號、聲音與表演調度切入,討論海妲・蓋柏樂在父權社會結構下的困境,並結合榮格心理學與馮.法蘭茲對「阿尼姆斯」與「永恆少年」原型的分析,理解女人何以走向精神性的操控、毀滅與死亡。
Thumbnail
5 月將於臺北表演藝術中心映演的「2026 北藝嚴選」《海妲・蓋柏樂》,由臺灣劇團「晃晃跨幅町」製作,本文將以從舞台符號、聲音與表演調度切入,討論海妲・蓋柏樂在父權社會結構下的困境,並結合榮格心理學與馮.法蘭茲對「阿尼姆斯」與「永恆少年」原型的分析,理解女人何以走向精神性的操控、毀滅與死亡。
Thumbnail
本文分析導演巴里・柯斯基(Barrie Kosky)如何運用極簡的舞臺配置,將布萊希特(Bertolt Brecht)的「疏離效果」轉化為視覺奇觀與黑色幽默,探討《三便士歌劇》在當代劇場中的新詮釋,並藉由舞臺、燈光、服裝、音樂等多方面,分析該作如何在保留批判核心的同時,觸及觀眾的觀看位置與人性幽微。
Thumbnail
本文分析導演巴里・柯斯基(Barrie Kosky)如何運用極簡的舞臺配置,將布萊希特(Bertolt Brecht)的「疏離效果」轉化為視覺奇觀與黑色幽默,探討《三便士歌劇》在當代劇場中的新詮釋,並藉由舞臺、燈光、服裝、音樂等多方面,分析該作如何在保留批判核心的同時,觸及觀眾的觀看位置與人性幽微。
Thumbnail
這是一場修復文化與重建精神的儀式,觀眾不需要完全看懂《遊林驚夢:巧遇Hagay》,但你能感受心與土地團聚的渴望,也不急著在此處釐清或定義什麼,但你的在場感受,就是一條線索,關於如何找著自己的路徑、自己的聲音。
Thumbnail
這是一場修復文化與重建精神的儀式,觀眾不需要完全看懂《遊林驚夢:巧遇Hagay》,但你能感受心與土地團聚的渴望,也不急著在此處釐清或定義什麼,但你的在場感受,就是一條線索,關於如何找著自己的路徑、自己的聲音。
Thumbnail
if 條件式
Thumbnail
if 條件式
Thumbnail
背景:從冷門配角到市場主線,算力與電力被重新定價   小P從2008進入股市,每一個時期的投資亮點都不同,記得2009蘋果手機剛上市,當時蘋果只要在媒體上提到哪一間供應鏈,隔天股價就有驚人的表現,當時光學鏡頭非常熱門,因為手機第一次搭上鏡頭可以拍照,也造就傳統相機廠的殞落,如今手機已經全面普及,題
Thumbnail
背景:從冷門配角到市場主線,算力與電力被重新定價   小P從2008進入股市,每一個時期的投資亮點都不同,記得2009蘋果手機剛上市,當時蘋果只要在媒體上提到哪一間供應鏈,隔天股價就有驚人的表現,當時光學鏡頭非常熱門,因為手機第一次搭上鏡頭可以拍照,也造就傳統相機廠的殞落,如今手機已經全面普及,題
Thumbnail
這篇內容,將會講解什麼是「if else」,以及與「if else」相關的知識。包括if else的簡介、if、if else、else if、套娃式的if。
Thumbnail
這篇內容,將會講解什麼是「if else」,以及與「if else」相關的知識。包括if else的簡介、if、if else、else if、套娃式的if。
Thumbnail
在程式世界裡,if 條件句是我們的好朋友,幫我們做各種決策。如果不注意可能會讓我們掉進小陷阱。文中透過幾個例子,在使用 if 時可能會遇到的一些常見問題,像是不必要的 if、過於複雜的條件、忘了用嚴格比較,還有嵌套太深的 if。透過這篇文章,你將學到如何避免這些小錯誤,寫出更乾淨、更有效率的程式碼。
Thumbnail
在程式世界裡,if 條件句是我們的好朋友,幫我們做各種決策。如果不注意可能會讓我們掉進小陷阱。文中透過幾個例子,在使用 if 時可能會遇到的一些常見問題,像是不必要的 if、過於複雜的條件、忘了用嚴格比較,還有嵌套太深的 if。透過這篇文章,你將學到如何避免這些小錯誤,寫出更乾淨、更有效率的程式碼。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News