【C++ 筆記】條件判斷 - part 4 === 目錄(Table of Contents): [TOC] --- 很感謝你點進來這篇文章。 你好,我並不是什麼 C++、程式語言的專家,所以本文若有些錯誤麻煩請各位鞭大力一點,我極需各位的指正及指導!!本系列文章的性質主要以詼諧的口吻,一派輕鬆的態度自學程式語言,如果你喜歡,麻煩留言說聲文章讚讚吧! 條件判斷(Condition) --- ![image](https://hackmd.io/_uploads/By-gSHPEA.png) Image Source:[Decision Making in C (if , if..else, Nested if, if-else-if ) - GeeksforGeeks](https://www.geeksforgeeks.org/decision-making-c-cpp/) 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 語句: ```cpp if(boolean_expression) { } ``` 如果 boolean_expression 為 true,也就是布林運算式,那麼就執行中括號裡面的內容。 如果 boolean_expression 為 false,則跳過中括號,繼續往下執行內容。 boolean_expression 我們可以舉以下例子: ```cpp if (a == b){ } ``` 即為一個布林運算式,之前我們說過,運算式是由運算元與運算子組成的一個結構,像是上面的範例 a == b 就是一種運算式。 接下來讓我們練習一下 if 語句: ```cpp= #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](https://hackmd.io/_uploads/S1wNt_dNC.png) 圖源:作者繪製 以上是 if、else 的基本架構之流程圖,若以這張圖來解釋的話,只有在當 if 是 False(條件不成立)的時候,才會執行 else 的判斷式。 ***總之,else 就是在當前一個條件不成立、False 的時候,才會執行。*** 我們再來用生活中的例子舉例好了: 今天有一個道路,呈現一個 T 字形,前面有兩個路口,其中左邊是被封住的,右邊是通的。 如果我們今天不顧一切就是要走左邊的話,那是不是此路不通,必須要改往右邊走? 而改往右邊走就代表說是 else 的判斷,最後就會執行 else 裡面的程式碼。 然後接著就是練習~~寫程式沒什麼秘訣,就是要勤奮的練習! ```cpp= #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; } ``` 輸出結果: ``` a > 50 a is : 100 ``` ### if-else if-else 語句 --- else if 就是在原本 else 的基礎上,多加一個 if 語句判斷條件。 定義如下: ```cpp= if(boolean_expression 1) { } else if( boolean_expression 2) { } else if( boolean_expression 3) { } else { } ``` 如果我們這樣寫(把 else if 寫在 else 下面): ```cpp= if(boolean_expression 1) { } else if( boolean_expression 2) { } else // Change position { } else if( boolean_expression 3) // Change position { } ``` 會出現以下的錯誤: ``` error: 'else' without a previous 'if' ``` 所以必須注意的是,***else 必須放在 if、else if 的最下面,因為 else 就是表示以上全部條件都不成立的情況下,才會執行。*** 繼續練習!以下是範例程式碼。 ```cpp= #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; } ``` 輸出結果: ``` a <= 100 a is : 100 ``` ### if 巢狀語句 --- 巢狀語句就是 if 裡面還有一個 if 繼續判斷,如下程式碼: ```cpp= if( boolean_expression 1) { if(boolean_expression 2) { } } ``` else if...else 的形式如下: ```cpp= if (condition1) { if (condition2) { } else { } } else { } ``` 其實這個程式邏輯與前面所述的 if、if-else 等等的語句是一樣的,只要我們靠「條件成立、不成立」來做二分法會容易許多,就是所謂的非 0 即 1。 所以,繼續來練習~~ ```cpp= #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; } ``` 輸出結果: ``` a < 150 a < 125 ``` 這就有點像是一道一道的關卡一樣,首先我們經過 a < 150 這道關卡,過去以後,系統提示說:a < 150;之後再經過 a < 125 這道關卡,過去以後,系統提示說:a < 125。 再練習一題: ```cpp= #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; } ``` 輸出結果: ``` a < 200 a >= 150 ``` 首先這支程式碼先判斷了 a 是否小於 200,如果條件成立,則最下面那個 else 就不會被觸發,就不會被執行到。 接著印出 a < 200。 然後繼續檢查:a 是否小於 150,這邊是使用 "<" 比較運算子,而不是 "<=",所以條件不成立。 不成立的話我們繼續走,發現還有一個 else 耶,那因為前面條件語句不成立,所以 else 以下程式碼就會執行囉! ### switch 條件語句 --- ![image](https://hackmd.io/_uploads/rJFJ9cd4A.png) Image Source:[Switch Statement in C++ - GeeksforGeeks](https://www.geeksforgeeks.org/switch-statement-in-cpp/) 以上是 switch 的運作方式之流程圖。 欸 switch 不是下面那個 switch 啊!! ![image](https://hackmd.io/_uploads/Hkvm9cdER.png) 圖源:[Nintendo Switch | 任天堂官方網站(台灣)](https://www.nintendo.tw/hardware/switch/) 咳、咳),所以說 switch 它其實是一個 if-else if-else 簡化過後的語法,兩者是可以互相交換的。 也可以說 switch = if-else if-else。 switch 在 C++ 的定義如下: ```cpp= switch(expression){ case constant-expression : break; case constant-expression : break; default : } ``` 可以看到上面有個 break,這是代表什麼意思呢?break 就是打斷的意思,在程式語言當中會停止當前的結構,並且跳出結構外,繼續進行程式碼。 什麼意思呢?比如說 switch 語句當中,每一個 case 都是在檢查運算式是否與 switch 本身的條件相等,如果相等就會做出相對應的動作,但同時也不會馬上離開 switch 語句,仍然還會繼續判斷下去,所以如果在這時候加上 break 的話,就能夠直接從 switch 語句當中跳出去。 必須注意的是,break 不能用在其他的條件語句,如 if、else if 等當中,否則會出現以下錯誤: ``` error: break statement not within loop or switch ``` 讓我們整理一下: * switch(expression) - 小括號裡面放上需要被檢驗的運算式 * case constant-expression - case 右邊一個空格,之後填上對應的常數運算式,每一次這個運算式都要跟 switch 的運算式做比較,是否相等?是的話,則執行 case 下面的內容。作用像是 else if。 * default - 作用等同於 else,當所有 case 的條件都不成立的時候就到最後的關頭,default。 練習練習~(範例取自:[switch 條件判斷](https://openhome.cc/Gossip/CppGossip/switchStatement.html)): ```cpp= #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 就沒有這種東西。 它的定義如下: ```cpp= Exp1 ? Exp2 : Exp3; ``` Exp = Expression - 運算式 什麼意思呢? 如果當 Exp1 為 True,也就是條件成立,則執行 Exp2。 如果當 Exp1 為 False,也就是條件不成立,則執行 Exp3。 那我們可以這樣說:三元運算子 = if else 的簡化形式。 總之老話一句,練習,安排! ```cpp= #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 語句: ```cpp= if(boolean_expression) { } ``` 如果 boolean_expression 為 true,也就是布林運算式,那麼就執行中括號裡面的內容。 如果 boolean_expression 為 false,則跳過中括號,繼續往下執行內容。 布林運算式:如同比較運算式,回傳的值必定為布林值。 if () 小括號內只填了運算式本身,則預設是條件判斷 True,因為 True 就表示條件成立才會繼續執行。 else 一定會在 if 條件句的下面,else 會在上一個條件語句不成立的時候執行。 else if 就是在原本 else 的基礎上,多加一個 if 語句判斷條件。 巢狀語句就是 if 裡面還有一個 if 繼續判斷,如下程式碼: ```cpp= if( boolean_expression 1) { if(boolean_expression 2) { } } ``` else if...else 的形式如下: ```cpp= if (condition1) { if (condition2) { } else { } } else { } ``` switch = if-else if-else。 switch 在 C++ 的定義如下: ```cpp= switch(expression){ case constant-expression : break; case constant-expression : break; default : } ``` 三元運算子(? :)的定義如下: ```cpp= Exp1 ? Exp2 : Exp3; ``` Exp = Expression - 運算式 什麼意思呢? 如果當 Exp1 為 True,也就是條件成立,則執行 Exp2。 如果當 Exp1 為 False,也就是條件不成立,則執行 Exp3。 那我們可以這樣說:三元運算子 = if else 的簡化形式。 參考資料 --- [三元運算子(Ternary Operator)和布林值混用的簡化方法 | by Yu-Hsien Yeh | Medium](https://medium.com/@yuhsienyeh/%E4%B8%89%E5%85%83%E9%81%8B%E7%AE%97%E5%AD%90-ternary-operator-%E5%92%8C%E5%B8%83%E6%9E%97%E5%80%BC%E6%B7%B7%E7%94%A8%E7%9A%84%E7%B0%A1%E5%8C%96%E6%96%B9%E6%B3%95-6bb70375fd65) [switch 條件判斷](https://openhome.cc/Gossip/CppGossip/switchStatement.html) [switch statement (C++) | Microsoft Learn](https://learn.microsoft.com/zh-tw/cpp/cpp/switch-statement-cpp?view=msvc-170) [Switch Statement in C++ - GeeksforGeeks](https://www.geeksforgeeks.org/switch-statement-in-cpp/) [Decision Making in C (if , if..else, Nested if, if-else-if ) - GeeksforGeeks](https://www.geeksforgeeks.org/decision-making-c-cpp/) [if 條件判斷](https://openhome.cc/Gossip/CppGossip/ifStatement.html) [if-else 語句 (C++) | Microsoft Learn](https://learn.microsoft.com/zh-tw/cpp/cpp/if-else-statement-cpp?view=msvc-170) [C++ if 语句 | 菜鸟教程](https://www.runoob.com/cplusplus/cpp-if.html) [C++ if…else 语句 | 菜鸟教程](https://www.runoob.com/cplusplus/cpp-if-else.html) [C++ 嵌套 if 语句 | 菜鸟教程](https://www.runoob.com/cplusplus/cpp-nested-if.html) [C++ 判断 | 菜鸟教程](https://www.runoob.com/cplusplus/cpp-decision.html) [C++ switch 语句 | 菜鸟教程](https://www.runoob.com/cplusplus/cpp-switch.html)