【C++ 筆記】條件判斷 - part 4

很感謝你點進來這篇文章。

你好,我並不是什麼 C++、程式語言的專家,所以本文若有些錯誤麻煩請各位鞭大力一點,我極需各位的指正及指導!!本系列文章的性質主要以詼諧的口吻,一派輕鬆的態度自學程式語言,如果你喜歡,麻煩留言說聲文章讚讚吧!

條件判斷(Condition)

image

Image Source:Decision Making in C (if , if..else, Nested if, if-else-if ) - GeeksforGeeks

Condition,表示一個情況,也可稱之為一個條件。

以上的圖中是 if 語句的流程圖,Condition 如果是 True 的話,則會經過 if Condition 判斷,直接進入到 username code,這個 username code 就是要由我們自己定義的執行內容。

如果 Condition 是 False,同樣也會進入到 username code,一樣是要由我們自己定義的執行內容。

回到正題,C++ 當中有四種條件語句的形式:

  • if
  • if-else
  • else if
  • switch

相信各位看到第四個肯定會想說,switch???

是的,就是各位想的那個 switch,交換器(讀者:我想的不是這個好嗎==)。

接下來就讓我們一個一個來介紹吧。

if 語句

以下是 C++ 定義的 if 語句:

1
2
3
4
if(boolean_expression)
{

}

如果 boolean_expression 為 true,也就是布林運算式,那麼就執行中括號裡面的內容。

如果 boolean_expression 為 false,則跳過中括號,繼續往下執行內容。

boolean_expression 我們可以舉以下例子:

1
2
3
if (a == b){

}

即為一個布林運算式,之前我們說過,運算式是由運算元與運算子組成的一個結構,像是上面的範例 a == b 就是一種運算式。

接下來讓我們練習一下 if 語句:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
using namespace std;

int main ()
{
bool a = false;

if( a )
{
cout << "a is true" << endl;
}

return 0;
}

如果 if 語句沒有設定條件的話,只放了變數進去,則預設就是判定 a == True。

if-else 語句

else 一定會在 if 條件句的下面,else 會在上一個條件語句不成立的時候執行。

什麼意思呢?我們先看以下這張流程圖:

圖片1

圖源:作者繪製

以上是 if、else 的基本架構之流程圖,若以這張圖來解釋的話,只有在當 if 是 False(條件不成立)的時候,才會執行 else 的判斷式。

總之,else 就是在當前一個條件不成立、False 的時候,才會執行。

我們再來用生活中的例子舉例好了:

今天有一個道路,呈現一個 T 字形,前面有兩個路口,其中左邊是被封住的,右邊是通的。

如果我們今天不顧一切就是要走左邊的話,那是不是此路不通,必須要改往右邊走?

而改往右邊走就代表說是 else 的判斷,最後就會執行 else 裡面的程式碼。

然後接著就是練習~~寫程式沒什麼秘訣,就是要勤奮的練習!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
using namespace std;

int main ()
{
int a = 100;

if( a < 50 )
{
cout << "a < 50" << endl;
}
else
{
cout << "a > 50" << endl;
}
cout << "a is : " << a << endl;

return 0;
}

輸出結果:

1
2
3
a > 50
a is : 100

if-else if-else 語句

else if 就是在原本 else 的基礎上,多加一個 if 語句判斷條件。

定義如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
if(boolean_expression 1)
{

}
else if( boolean_expression 2)
{

}
else if( boolean_expression 3)
{

}
else
{

}

如果我們這樣寫(把 else if 寫在 else 下面):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
if(boolean_expression 1)
{

}
else if( boolean_expression 2)
{

}
else // Change position
{

}
else if( boolean_expression 3) // Change position
{

}

會出現以下的錯誤:

1
error: 'else' without a previous 'if'

所以必須注意的是,else 必須放在 if、else if 的最下面,因為 else 就是表示以上全部條件都不成立的情況下,才會執行。

繼續練習!以下是範例程式碼。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <iostream>
using namespace std;

int main ()
{
int a = 100;

if( a < 0 )
{
cout << "a < 0" << endl;
}
else if ( a < 10 )
{
cout << "a < 10" << endl;
}
else if ( a < 20 )
{
cout << "a < 20" << endl;
}
else if ( a < 40 )
{
cout << "a < 40" << endl;
}
else if ( a < 80 )
{
cout << "a < 80" << endl;
}
else if ( a <= 100 )
{
cout << "a <= 100" << endl;
}
else
{
cout << "Not Match" << endl;
}

cout << "a is : " << a << endl;

return 0;
}

輸出結果:

1
2
3
a <= 100
a is : 100

if 巢狀語句

巢狀語句就是 if 裡面還有一個 if 繼續判斷,如下程式碼:

1
2
3
4
5
6
7
8
if( boolean_expression 1)
{

if(boolean_expression 2)
{

}
}

else if…else 的形式如下:

1
2
3
4
5
6
7
8
9
10
11
12
if (condition1) {

if (condition2) {

}
else {

}
}
else {

}

其實這個程式邏輯與前面所述的 if、if-else 等等的語句是一樣的,只要我們靠「條件成立、不成立」來做二分法會容易許多,就是所謂的非 0 即 1。

所以,繼續來練習~~

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
using namespace std;

int main() {
int a = 100;

if ( a < 150 ) {
cout << "a < 150" << endl;

if ( a < 125 ) {
cout << "a < 125" << endl;
}
}

return 0;
}

輸出結果:

1
2
3
a < 150
a < 125

這就有點像是一道一道的關卡一樣,首先我們經過 a < 150 這道關卡,過去以後,系統提示說:a < 150;之後再經過 a < 125 這道關卡,過去以後,系統提示說:a < 125。

再練習一題:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
using namespace std;

int main() {
int a = 150;

if (a < 200) {
cout << "a < 200" << endl;

if (a < 150) {
cout << "a < 150" << endl;
} else {
cout << "a >= 150" << endl;
}
} else {
cout << "a <= 200" << endl;
}

return 0;
}

輸出結果:

1
2
3
a < 200
a >= 150

首先這支程式碼先判斷了 a 是否小於 200,如果條件成立,則最下面那個 else 就不會被觸發,就不會被執行到。

接著印出 a < 200。

然後繼續檢查:a 是否小於 150,這邊是使用 “<” 比較運算子,而不是 “<=”,所以條件不成立。

不成立的話我們繼續走,發現還有一個 else 耶,那因為前面條件語句不成立,所以 else 以下程式碼就會執行囉!

switch 條件語句

image

Image Source:Switch Statement in C++ - GeeksforGeeks

以上是 switch 的運作方式之流程圖。

欸 switch 不是下面那個 switch 啊!!

image

圖源:Nintendo Switch | 任天堂官方網站(台灣)

咳、咳),所以說 switch 它其實是一個 if-else if-else 簡化過後的語法,兩者是可以互相交換的。

也可以說 switch = if-else if-else。

switch 在 C++ 的定義如下:

1
2
3
4
5
6
7
8
9
10
switch(expression){
case constant-expression :

break;
case constant-expression :

break;
default :

}

可以看到上面有個 break,這是代表什麼意思呢?break 就是打斷的意思,在程式語言當中會停止當前的結構,並且跳出結構外,繼續進行程式碼。

什麼意思呢?比如說 switch 語句當中,每一個 case 都是在檢查運算式是否與 switch 本身的條件相等,如果相等就會做出相對應的動作,但同時也不會馬上離開 switch 語句,仍然還會繼續判斷下去,所以如果在這時候加上 break 的話,就能夠直接從 switch 語句當中跳出去。

必須注意的是,break 不能用在其他的條件語句,如 if、else if 等當中,否則會出現以下錯誤:

1
error: break statement not within loop or switch

讓我們整理一下:

  • switch(expression) - 小括號裡面放上需要被檢驗的運算式
  • case constant-expression - case 右邊一個空格,之後填上對應的常數運算式,每一次這個運算式都要跟 switch 的運算式做比較,是否相等?是的話,則執行 case 下面的內容。作用像是 else if。
  • default - 作用等同於 else,當所有 case 的條件都不成立的時候就到最後的關頭,default。

練習練習~(範例取自:switch 條件判斷):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <iostream>
using namespace std;

int main() {
int score = 0;

cout << "輸入分數:";
cin >> score;

switch(score / 10) {
case 10: case 9:
cout << "得 A" << endl;
break;
case 8:
cout << "得 B" << endl;
break;
case 7:
cout << "得 C" << endl;
break;
case 6:
cout << "得 D" << endl;
break;
default:
cout << "得 E(不及格)" << endl;
break;
}

return 0;
}

cin 我們在之前有說過,是 C++ 當中表示輸入的意思。其字面意思拆解為 character input,表示字元輸入。

這支程式碼當中可以看到有 case 10: case 9: 的寫法,其實就是表示說 10、9 兩個條件其中之一成立的話就可以了,也就是說得 10,會輸出結果為 A;得 9,輸出結果也是為 A。

那各位肯定又有疑問了,像我 95 / 10,不是等於 9.5 嗎?這樣難道不會程式出現錯誤嗎?

這點不用擔心,因為最上面 score 所被宣告的資料型態為整數 int,小數點會自動被去除。

? : 三元運算子

? : 三元運算子是在 C++ 當中很特別的運算子,像 Python 就沒有這種東西。

它的定義如下:

1
Exp1 ? Exp2 : Exp3;

Exp = Expression - 運算式

什麼意思呢?

如果當 Exp1 為 True,也就是條件成立,則執行 Exp2。

如果當 Exp1 為 False,也就是條件不成立,則執行 Exp3。

那我們可以這樣說:三元運算子 = if else 的簡化形式。

總之老話一句,練習,安排!

1
2
3
4
5
6
7
8
9
10
#include<iostream>
using namespace std;

int main(){
int a, b;
cout << "請輸入兩數:";
cin >> a >> b;
a > b ? cout << a << " > " << b << endl : cout << b << " < " << a << endl;
return 0;
}

以上是比較兩數大於小於的程式碼,

? 問號前面放的是一個運算式,如上面的 a > b,如果 a > b 是 True,則執行 cout << a << “ > “ << b << endl,這個放在冒號前面。

而 ? 問號前面的 a > b 如果是 False,則執行 cout << b << “ < “ << a << endl;,這個放在冒號後面,記得最後面要加上我們最愛最恨的分號歐!

總結

C++ 當中有四種條件語句的形式:

  • if
  • if-else
  • else if
  • switch

以下是 C++ 定義的 if 語句:

1
2
3
4
if(boolean_expression)
{

}

如果 boolean_expression 為 true,也就是布林運算式,那麼就執行中括號裡面的內容。

如果 boolean_expression 為 false,則跳過中括號,繼續往下執行內容。

布林運算式:如同比較運算式,回傳的值必定為布林值。

if () 小括號內只填了運算式本身,則預設是條件判斷 True,因為 True 就表示條件成立才會繼續執行。

else 一定會在 if 條件句的下面,else 會在上一個條件語句不成立的時候執行。

else if 就是在原本 else 的基礎上,多加一個 if 語句判斷條件。

巢狀語句就是 if 裡面還有一個 if 繼續判斷,如下程式碼:

1
2
3
4
5
6
7
8
if( boolean_expression 1)
{

if(boolean_expression 2)
{

}
}

else if…else 的形式如下:

1
2
3
4
5
6
7
8
9
10
11
12
if (condition1) {

if (condition2) {

}
else {

}
}
else {

}

switch = if-else if-else。

switch 在 C++ 的定義如下:

1
2
3
4
5
6
7
8
9
10
switch(expression){
case constant-expression :

break;
case constant-expression :

break;
default :

}

三元運算子(? :)的定義如下:

1
Exp1 ? Exp2 : Exp3;

Exp = Expression - 運算式

什麼意思呢?

如果當 Exp1 為 True,也就是條件成立,則執行 Exp2。

如果當 Exp1 為 False,也就是條件不成立,則執行 Exp3。

那我們可以這樣說:三元運算子 = if else 的簡化形式。

參考資料

三元運算子(Ternary Operator)和布林值混用的簡化方法 | by Yu-Hsien Yeh | Medium

switch 條件判斷

switch statement (C++) | Microsoft Learn

Switch Statement in C++ - GeeksforGeeks

Decision Making in C (if , if..else, Nested if, if-else-if ) - GeeksforGeeks

if 條件判斷

if-else 語句 (C++) | Microsoft Learn

C++ if 语句 | 菜鸟教程

C++ if…else 语句 | 菜鸟教程

C++ 嵌套 if 语句 | 菜鸟教程

C++ 判断 | 菜鸟教程

C++ switch 语句 | 菜鸟教程