C++ 入門指南 4.01

單元 6 - 運算式與陳述

-unit6-

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

operand_1
operand_1 operator operand_2
operand1 ? operand_2 : operand_3

紅色框框為單一個運算元,藍色框框為兩個運算元,最後一個是三個運算元。

單一運算元就構成一個運算式,運算元可以是變數 (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 變成 falsefalse 變成 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_2operand_3

有沒有看的眼花撩亂?居然可以有 f = a != b 之類的式子,這是因為運算子有計算的優先次序 (precedence) ,由於 != 的優先順序在 = 之前,所以 a != b 會先被計算,結果才會指派到 f 之中。如果不是很清楚各個運算子的優先次序,保險一點的做法可以用小括弧,先把要先被計算的運算式圍起來,例如

f = (a != b); // 等於 f = a != b

這是因為小括弧有最高的優先計算次序。

加上分號,運算式就是程式 (program) 中獨立的陳述 (statement) ,陳述為 C++ 程式最基本的執行單位,每個 C++ 程式都是從 main() 中由前而後,一個陳述接著一個陳述來執行。

陳述也有好幾種,最簡單的陳述就是單一個分號

; // 什麼事也不做的陳述

其他很多都是連帶運算式單獨一行的陳述,然而許多控制結構 (control structure) 是屬於多行的複合陳述 (compound statement) ,我們先來看看控制結構中的選擇吧!

中英文術語對照
布林值Boolean value
算術運算子arithmetic operator
指派運算子assignment operator
複合陳述compound statement
控制結構control structure
相等性及關係運算子equality and relational operator
運算式expression
浮點數floating-point number
函數function
整數integer
字面常數literal
成員member
優先次序precedence
程式program
運算元operand
運算子operator
回傳值return value
陳述statement
變數variable
重點整理
1. 運算式由運算元與運算子所組成,單一運算元就可構成運算式,其餘單元運算子結合單一運算元,或是兩個運算元結合一個運算子。
2. 運算子依種類分有單元運算子、算術運算子、相等性及關係運算子、指派運算子等。
3. 算術運算子用於整數及浮點數型態,計算結果也是整數或浮點數。
4. 相等性及關係運算子用於整數及浮點數型態,計算結果為 truefalse
5. 指派運算子為單一個等號,可以跟算術運算子結合為複合運算子。
6. 小括弧有最高的計算優先次序。
7. 陳述為程式執行獨立的單位,最簡單的陳述為單一個分號。
問題與討論
1. 算術運算子可以用在其他基本資料型態或物件嗎?字元可不可以相加?字串又可不可以相加呢?
2. 為什麼測試相等的運算子為連續兩個等號?
3. 為什麼需要三元運算子,三元運算子有什麼方便的地方?
4. 為什麼計算的優先次序很重要?
練習
1. 寫一個程式 exercise0601.cxx ,宣告三個整數變數 abresulta 設定為 2b 設定為 8result 用來取得計算結果,利用 +-*/% 計算出兩者加、減、乘、除、取餘數的結果,然後印在命令列上。 參考程式碼
2. 承上題,另寫一個程式 exercise0602.cxx ,宣告完 ab 後,加入 cin >> a;cin >> b; 接收使用者輸入,再計算出結果,然後印在命令列上。 參考程式碼
3. 承上題,另寫一個程式 exercise0603.cxx ,宣告第四個字串變數 op,並以 op 取得使用者輸入的運算子,以運算子做相對應的計算,然後把結果印在命令列上。 參考程式碼
4. 承上題,另寫一個程式 exercise0604.cxx ,將 abresult改成宣告為 double 型態,移除掉計算餘數的部分,計算出結果,然後把結果印在命令列上。 參考程式碼
5. 承上題,另寫一個程式 exercise0605.cxx ,將 main() 中的參數列加入參數 int argc, char *argv[] ,這會把執行指令後用空格相隔的數字或英文單字當作輸入,其中 argc 為輸入的總量, argv 則是字串陣列,利用這種方式改成從命令列輸入兩個數字及計算符號,計算出結果,然後把結果印在命令列上。 參考程式碼
6. 寫一個程式 exercise0606.cxx ,宣告一個整數變數 a ,將 a 的初值設定為 0 ,接著印出 a 的值同時做前遞增三次。 參考程式碼
7. 承上題,另寫一個程式 exercise0607.cxx ,增加宣告一個整數變數 b ,並將 b 的初值設定為 0 ,接著印出 b 的值同時做後遞增三次。 參考程式碼
8. 寫一個程式 exercise0608.cxx ,宣告一個字串變數 a ,並且用建構函數將 a 的值設定為 "a" ,然後印出 aa + aa + a + aa + a + a + aa + a + a + a + a參考程式碼
9. 寫一個程式 exercise0609.cxx ,宣告兩個整數變數 abab 可設定任意值,然後加入 cout << (a > b ? "a is bigger" : "b is bigger") << endl; 印出結果。 參考程式碼
10. 承上題,另寫一個程式 exercise0610.cxx ,改成接受使用者輸入的版本。 參考程式碼
11. 承上題,另寫一個程式 exercise0611.cxx ,改成命令列輸入的版本。 參考程式碼

相關教學影片

上一頁 單元 5 - 變數命名規則
回 C++ 入門指南 4.01 目錄
下一頁 單元 7 - 選擇
回 C++ 教材
回程式語言教材首頁