C++ 入門指南 V2.00 - 單元 6 - 運算式與陳述




運算式 (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 變成 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) ,我們先來看看控制結構中的選擇吧!


中英文術語對照


運算式 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

重點整理


  1. 運算式由運算元與運算子所組成,單一運算元就可構成運算式,其餘單元運算子結合單一運算元,或是兩個運算元結合一個運算子。
  2. 運算子依種類分有單元運算子、算術運算子、相等性及關係運算子、指派運算子等。
  3. 算術運算子用於整數及浮點數型態,計算結果也是整數或浮點數。
  4. 相等性及關係運算子用於整數及浮點數型態,計算結果為 truefalse
  5. 指派運算子為單一個等號,可以跟算術運算子結合為複合運算子。
  6. 小括弧有最高的計算優先次序。
  7. 陳述為程式執行獨立的單位,最簡單的陳述為單一個分號。

問題與討論


  1. 算術運算子可以用在其他基本資料型態或物件嗎?字元可不可以相加?字串又可不可以相加呢?
  2. 為什麼測試相等的運算子為連續兩個等號?
  3. 為什麼需要三元運算子,三元運算子有什麼方便的地方?
  4. 為什麼計算的優先次序很重要?

練習


  1. 寫一個程式 exercise0601.cpp ,宣告兩個整數變數 aba 設定為 2b 設定為 8 ,利用 +-*/% 計算出兩者加、減、乘、除、取餘數的結果。
  2. 承上題,另寫一個程式 exercise0602.cpp ,宣告完 ab 後,加入 cin >> a;cin >> b; 接收使用者輸入,然後再計算出結果。
  3. 承上題,另寫一個程式 exercise0603.cpp ,將 ab 改成宣告為 double 型態,移除掉計算餘數的部分,然後計算出結果。
  4. 寫一個程式 exercise0604.cpp ,宣告一個整數變數 a ,接著利用前遞增將 a 遞增至 8
  5. 寫一個程式 exercise0605.cpp ,宣告一個字串變數 a ,並且用建構函數將 a 的值設定為 "a" ,然後印出 aa + aa + a + aa + a + a + aa + a + a + a + a
  6. 寫一個程式 exercise0606.cpp ,宣告兩個整數變數 abab 可設定任意值,然後加入 cout << (a > b ? "a is bigger" : "b is bigger") << endl; 印出結果。
  7. 承上題,另寫一個程式 exercise0607.cpp ,改成接受使用者輸入的版本。

the end

沒有留言: