無痛入手 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
3會員
14內容數
程式設計 & 電腦系統 & 系統軟體
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
鏟薯員的窩 的其他內容
<iostream> ​在之前的文章有提到過,<iostream> 是專門處理程式的輸入 (input) 以及輸出 (output) 的函式庫。輸入輸出的對象是以電腦作為主角: 輸入指的是「把資料給電腦」,輸出指的是「從電腦那邊取得資料」。 在這個系列的文章中,程式輸入指的都是從鍵盤輸入資料給電
電腦只做一件事情: 運算。 我們所看到的任何酷酷的應用: 不論是網頁動畫、遊戲特效、甚至是 AI 說的話,全部都 是由電腦的運算結果組合而成的。 首先我們來梳理一下各個名詞之間的關聯: 1. 運算分成兩個部分: 運算子 (運算的名稱,如: 加法) 和運算元 (運算的對象,如: 8)。運算就是對資
這個系列是專門寫給 0 程式設計經驗的初學者的 C++ 教學, 無需架設環境,直接開始無痛入手 C++ ~
<iostream> ​在之前的文章有提到過,<iostream> 是專門處理程式的輸入 (input) 以及輸出 (output) 的函式庫。輸入輸出的對象是以電腦作為主角: 輸入指的是「把資料給電腦」,輸出指的是「從電腦那邊取得資料」。 在這個系列的文章中,程式輸入指的都是從鍵盤輸入資料給電
電腦只做一件事情: 運算。 我們所看到的任何酷酷的應用: 不論是網頁動畫、遊戲特效、甚至是 AI 說的話,全部都 是由電腦的運算結果組合而成的。 首先我們來梳理一下各個名詞之間的關聯: 1. 運算分成兩個部分: 運算子 (運算的名稱,如: 加法) 和運算元 (運算的對象,如: 8)。運算就是對資
這個系列是專門寫給 0 程式設計經驗的初學者的 C++ 教學, 無需架設環境,直接開始無痛入手 C++ ~
你可能也想看
Google News 追蹤
Thumbnail
隨著理財資訊的普及,越來越多台灣人不再將資產侷限於台股,而是將視野拓展到國際市場。特別是美國市場,其豐富的理財選擇,讓不少人開始思考將資金配置於海外市場的可能性。 然而,要參與美國市場並不只是盲目跟隨標的這麼簡單,而是需要策略和方式,尤其對新手而言,除了選股以外還會遇到語言、開戶流程、Ap
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
這篇內容,將會講解什麼是「if else」,以及與「if else」相關的知識。包括if else的簡介、if、if else、else if、套娃式的if。
Thumbnail
此章節的目的是介紹Java程式語言中的流程控制結構,包括條件語句(if, else if, else)、三元運算子、switch語句,以及各種迴圈(for, foreach, while)。同時,也解釋了如何在迴圈中使用控制語句來改變程式的執行流程。每種主題都配有示例程式碼以幫助理解。
Thumbnail
本章節提供了關於Typescript中流程控制元素的詳細介紹,包括if, else if, else語句,三元運算子,switch語句,各種for迴圈,while迴圈,循環嵌套和控制迴圈語句(break,continue和標籤)的使用。
Thumbnail
本文是C#入門教程的一部分,涵蓋了流程控制的各種語句與迴圈。這包括if、else if和else語句,三元運算子,switch語句,以及for、foreach和while迴圈。文中還介紹了如何在迴圈中使用break、continue、return和goto語句。
※ 條件判斷語法 決策中需要處理分歧的狀況,就會用到「if」、「else if」、「else」。 ※ 語法結構: 條件式使用小括號(),裡面放判斷式。 要執行的程式碼放在大括號{}裡。 條件式只會有 true 或 false 兩種結果。 ※ 常用的比較運算子: > 大於 < 小於
Thumbnail
在程式世界裡,if 條件句是我們的好朋友,幫我們做各種決策。如果不注意可能會讓我們掉進小陷阱。文中透過幾個例子,在使用 if 時可能會遇到的一些常見問題,像是不必要的 if、過於複雜的條件、忘了用嚴格比較,還有嵌套太深的 if。透過這篇文章,你將學到如何避免這些小錯誤,寫出更乾淨、更有效率的程式碼。
Thumbnail
關於程式語言的學習,只要掌握住幾個基本特性要熟悉幾種程式語言也不困難,這三個基本特性就是…
Thumbnail
IF,Switch,三元運算子語法說明 IF條件選擇結構說明 IF為布林條件,當()內條件式滿足True執行if區塊的程式碼,不滿足則執行else區塊的程式碼,若無else也行。
Thumbnail
介紹C++ 語法 資料型態,架構說明 程式語言為人類與電腦溝通的工具 程式設計流程: 定義問題 -> 問題分析 -> 撰寫演算法 ->程式撰寫 -> 程式執行及維護
Thumbnail
隨著理財資訊的普及,越來越多台灣人不再將資產侷限於台股,而是將視野拓展到國際市場。特別是美國市場,其豐富的理財選擇,讓不少人開始思考將資金配置於海外市場的可能性。 然而,要參與美國市場並不只是盲目跟隨標的這麼簡單,而是需要策略和方式,尤其對新手而言,除了選股以外還會遇到語言、開戶流程、Ap
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
這篇內容,將會講解什麼是「if else」,以及與「if else」相關的知識。包括if else的簡介、if、if else、else if、套娃式的if。
Thumbnail
此章節的目的是介紹Java程式語言中的流程控制結構,包括條件語句(if, else if, else)、三元運算子、switch語句,以及各種迴圈(for, foreach, while)。同時,也解釋了如何在迴圈中使用控制語句來改變程式的執行流程。每種主題都配有示例程式碼以幫助理解。
Thumbnail
本章節提供了關於Typescript中流程控制元素的詳細介紹,包括if, else if, else語句,三元運算子,switch語句,各種for迴圈,while迴圈,循環嵌套和控制迴圈語句(break,continue和標籤)的使用。
Thumbnail
本文是C#入門教程的一部分,涵蓋了流程控制的各種語句與迴圈。這包括if、else if和else語句,三元運算子,switch語句,以及for、foreach和while迴圈。文中還介紹了如何在迴圈中使用break、continue、return和goto語句。
※ 條件判斷語法 決策中需要處理分歧的狀況,就會用到「if」、「else if」、「else」。 ※ 語法結構: 條件式使用小括號(),裡面放判斷式。 要執行的程式碼放在大括號{}裡。 條件式只會有 true 或 false 兩種結果。 ※ 常用的比較運算子: > 大於 < 小於
Thumbnail
在程式世界裡,if 條件句是我們的好朋友,幫我們做各種決策。如果不注意可能會讓我們掉進小陷阱。文中透過幾個例子,在使用 if 時可能會遇到的一些常見問題,像是不必要的 if、過於複雜的條件、忘了用嚴格比較,還有嵌套太深的 if。透過這篇文章,你將學到如何避免這些小錯誤,寫出更乾淨、更有效率的程式碼。
Thumbnail
關於程式語言的學習,只要掌握住幾個基本特性要熟悉幾種程式語言也不困難,這三個基本特性就是…
Thumbnail
IF,Switch,三元運算子語法說明 IF條件選擇結構說明 IF為布林條件,當()內條件式滿足True執行if區塊的程式碼,不滿足則執行else區塊的程式碼,若無else也行。
Thumbnail
介紹C++ 語法 資料型態,架構說明 程式語言為人類與電腦溝通的工具 程式設計流程: 定義問題 -> 問題分析 -> 撰寫演算法 ->程式撰寫 -> 程式執行及維護