
運算式 (expression) 由運算元 (operand) 與運算子 (operator) 所組成,依運算元的數量,運算式可以簡單分為下列三種

紅色框框為單一個運算元,藍色框框為兩個運算元,最後一個是三個運算元。
單一運算元就構成一個運算式,運算元可以是變數 (variable) 、字面常數 (literal) 或呼叫函數 (function) 或成員 (member) ,例如
| // 以變數當運算元 | |
| a; | |
| // 以字面常數當運算元 | |
| 3; | |
| // 呼叫 print_prompt() 當運算元 | |
| print_prompt(); |
運算式,顧名思義,其為運算出一個結果的式子,因此單一運算元的運算式所得到的結果就是運算元的值,如果是呼叫函數,就是函數的回傳值 (return value) 囉!
單一運算元也可以結合單元運算子,單元運算子有
| 運算子 | 功能 | 範例 |
|---|---|---|
| + | 正 | +a |
| - | 負 | -a |
| ++ | 遞增 | ++a, a++ |
| -- | 遞減 | --a, a-- |
| ! | 邏輯補數運算子 | ~a |
正負如果一般數學表示正負值一樣,同樣的,負負會得正
| int a = -3; | |
| int b = +a; // b 會等於 -3 | |
| int c = -a; // c 會等於 3 |
遞增、遞減則是會將整數變數遞增 1 或遞減 1 ,有前後之別
| int a = 3; | |
| int b = ++a; // b 會等於 4 | |
| int c = a++; // c 會等於 4 | |
| int d = --a; // d 會等於 4 | |
| int e = a--; // e 會等於 4 |
邏輯補數運算子會把 true 變成 false , false 變成 true
| bool a = true; | |
| bool b = !a; // b 會等於 false | |
| bool c = !b; // c 會等於 true |
一般運算子都須結合兩個運算元,例如算術運算子 (arithmetic operator) ,可用在整數 (integer) 及浮點數 (floating-point number) ,計算結果也為整數或浮點數
| 運算子 | 功能 | 範例 |
|---|---|---|
| + | 加 | a + b |
| - | 減 | a - b |
| * | 乘 | a * b |
| / | 除 | a / b |
| % | 取餘數 | a % b |
例如
| int a = 11; | |
| int b = a + 33; // b 會等於 44 | |
| int c = b - 22; // c 會等於 22 | |
| int d = c * 11; // d 會等於 242 | |
| int e = d / 44; // e 會等於 5 | |
| int f = e % 55; // f 會等於 5 |
相等性及關係運算子 (equality and relational operator) ,可用於整數及浮點數或布林值 (Boolean value) ,計算結果不是 true 就是 false
| 運算子 | 功能 | 範例 |
|---|---|---|
| == | 相等 | a == b |
| != | 不相等 | a != b |
| > | 大於 | a > b |
| >= | 大於等於 | a >= b |
| < | 小於 | a < b |
| <= | 小於等於 | a <= b |
例如
| int a = 11; | |
| int b = 22; | |
| bool c = a >= b; // c 會等於 false | |
| bool d = a <= b; // d 會等於 true | |
| bool e = c == d; // e 會等於 false | |
| bool f = a != b; // f 會等於 true |
我們運用的等號,其實屬於指派運算子 (assignment operator) ,所謂的指派就是把等號右邊的東東給左邊的變數
| 運算子 | 功能 | 範例 |
|---|---|---|
| = | 指派 | a = b |
| += | 相加同時指派 | a += b |
| -= | 相減同時指派 | a -= b |
| *= | 相乘同時指派 | a *= b |
| /= | 相除同時指派 | a /= b |
| %= | 取餘數同時指派 | a %= b |
例如
| int a = 11; | |
| a += 33; // a 會等於 44 | |
| a -= 22; // a 會等於 22 | |
| a *= 11; // a 會等於 242 | |
| a /= 44; // a 會等於 5 | |
| a %= 55; // a 會等於 5 |
需要三個運算元的運算子只有一個 ?: ,依第一個運算元 operand_1 的真假值回傳 operand_2 或 operand_3 。
有沒有看的眼花撩亂?居然可以有 f = a != b 之類的式子,這是因為運算子有計算的優先次序 (precedence) ,由於 != 的優先順序在 = 之前,所以 a != b 會先被計算,結果才會指派到 f 之中。如果不是很清楚各個運算子的優先次序,保險一點的做法可以用小括弧,先把要先被計算的運算式圍起來,例如
| f = (a != b); // 等於 f = a != b |
這是因為小括弧有最高的優先計算次序。
加上分號,運算式就是程式 (program) 中獨立的陳述 (statement) ,陳述為 C++ 程式最基本的執行單位,每個 C++ 程式都是從 main() 中由前而後,一個陳述接著一個陳述來執行。
陳述也有好幾種,最簡單的陳述就是單一個分號
| ; // 什麼事也不做的陳述 |
其他很多都是連帶運算式單獨一行的陳述,然而許多控制結構 (control structure) 是屬於多行的複合陳述 (compound statement) ,我們先來看看控制結構中的選擇吧!
中英文術語對照
| 運算式 | expression |
| 運算元 | operand |
| 運算子 | operator |
| 變數 | variable |
| 字面常數 | literal |
| 函數 | function |
| 成員 | member |
| 回傳值 | return value |
| 算術運算子 | arithmetic operator |
| 整數 | integer |
| 浮點數 | floating-point number |
| 相等性及關係運算子 | equality and relational operator |
| 布林值 | Boolean value |
| 指派運算子 | assignment operator |
| 優先次序 | precedence |
| 程式 | program |
| 陳述 | statement |
| 控制結構 | control structure |
| 複合陳述 | compound statement |
重點整理
- 運算式由運算元與運算子所組成,單一運算元就可構成運算式,其餘單元運算子結合單一運算元,或是兩個運算元結合一個運算子。
- 運算子依種類分有單元運算子、算術運算子、相等性及關係運算子、指派運算子等。
- 算術運算子用於整數及浮點數型態,計算結果也是整數或浮點數。
- 相等性及關係運算子用於整數及浮點數型態,計算結果為 true 或 false 。
- 指派運算子為單一個等號,可以跟算術運算子結合為複合運算子。
- 小括弧有最高的計算優先次序。
- 陳述為程式執行獨立的單位,最簡單的陳述為單一個分號。
問題與討論
- 算術運算子可以用在其他基本資料型態或物件嗎?字元可不可以相加?字串又可不可以相加呢?
- 為什麼測試相等的運算子為連續兩個等號?
- 為什麼需要三元運算子,三元運算子有什麼方便的地方?
- 為什麼計算的優先次序很重要?
練習
- 寫一個程式 exercise0601.cpp ,宣告兩個整數變數 a 及 b , a 設定為 2 , b 設定為 8 ,利用 + 、 - 、 * 、 / 、 % 計算出兩者加、減、乘、除、取餘數的結果。
- 承上題,另寫一個程式 exercise0602.cpp ,宣告完 a 及 b 後,加入 cin >> a; 及 cin >> b; 接收使用者輸入,然後再計算出結果。
- 承上題,另寫一個程式 exercise0603.cpp ,將 a 及 b 改成宣告為 double 型態,移除掉計算餘數的部分,然後計算出結果。
- 寫一個程式 exercise0604.cpp ,宣告一個整數變數 a ,接著利用前遞增將 a 遞增至 8 。
- 寫一個程式 exercise0605.cpp ,宣告一個字串變數 a ,並且用建構函數將 a 的值設定為 "a" ,然後印出 a 、 a + a 、 a + a + a 、 a + a + a + a 、 a + a + a + a + a 。
- 寫一個程式 exercise0606.cpp ,宣告兩個整數變數 a 及 b , a 與 b 可設定任意值,然後加入 cout << (a > b ? "a is bigger" : "b is bigger") << endl; 印出結果。
- 承上題,另寫一個程式 exercise0607.cpp ,改成接受使用者輸入的版本。
the end
沒有留言:
張貼留言