47
第三章 運算子、運算元 與運算式 3-1 運算式簡介 3-2 運算子簡介 3-1-1 運算式的分類 3-2-1 運算子優先順序 3-2-2 算術運算子 3-2-3 關係運算子 3-2-4 邏輯運算子 3-2-5 位元運算子 3-2-6 條件運算子 3- 3 上機實習課程

C語言 第三章 03 運算子、運算元與運算式

Embed Size (px)

Citation preview

Page 1: C語言 第三章 03 運算子、運算元與運算式

王智祥

第三章 運算子、運算元     與運算式

3 - 1 運算式簡介

3 - 2 運算子簡介

3 - 1 - 1 運算式的分類

3 - 2 - 1 運算子優先順序

3 - 2 - 2 算術運算子

3 - 2 - 3 關係運算子

3 - 2 - 4 邏輯運算子

3 - 2 - 5 位元運算子

3 - 2 - 6 條件運算子

3 - 3 上機實習課程

Page 2: C語言 第三章 03 運算子、運算元與運算式

3-1-1 運算式的分類

下面簡單介紹這些運算式的特性與範例:

3- 1 運算式簡介

P 3-2

一元運算式: 由一元運算子所組成的運算式,在運算子左側或右側僅有一個運算元。

例如 -100 (負數)、 tmp-- (遞減)、 sum++ (遞增)等。

二元運算式: 由二元運算子所組成的運算式,在運算子兩側都有運算元。 例如 A+B (加)、 A=10 (等於)、 x+=y (遞增等於)等

三元運算式: 由三元運算子所組成的運算式。由於此類型的運算子僅有「 :? 」 「條件運算子」,因此三元運算式又稱為「條件運算式」。

例如, a>b?’   Y’   :’   N’ 。

Page 3: C語言 第三章 03 運算子、運算元與運算式

1. 當遇到一個運算式時,先區分運算子與運算元。

3 - 2 - 1 運算子優先順序 3- 2 運算子簡介

P 3-4

在處理一個多運算子的運算式時,有一些規則與步驟是必須要遵守,如下所示:

2. 依照運算子的優先順序作整理的動作。

3. 將各運算子根據其結合順序進行運算。

Page 4: C語言 第三章 03 運算子、運算元與運算式

說   明運算子

指定運算=

條件運算子?:

邏輯運算 AND邏輯運算 OR

&&||

位元運算 AND位元運算 XOR位元運算 OR

&^|

比較運算等於比較運算不等於

==!=

比較運算大於比較運算大於等於比較運算小於比較運算小於等於

>>=<

<=

3 - 2 - 1 運算子優先順序 3- 2 運算子簡介

P 3-4

以下是 C 中各種運算子計算的優先順序 :

邏輯運算 NOT負號遞增運算遞減運算

!-

++--

括號()

說   明運算子

位元左移運算位元右移運算

<<>>

加法運算減法運算

+-

乘法運算除法運算餘數運算

*/

%

Page 5: C語言 第三章 03 運算子、運算元與運算式

 

a----a

遞減--

a++++a

遞增++

+a正號+x

-a負號-x

a%b取餘數%

a/b除/

a*b乘*

a-b減-

a+b加+

用 法功 能運算子

 

3 - 2 - 2 算術運算子 (1) 3- 2 運算子簡介

P 3-5

算術運算子的符號與名稱如下表所示:

Page 6: C語言 第三章 03 運算子、運算元與運算式

10 – 2 * 3

3 - 2 - 2 算術運算子 (2) 3- 2 運算子簡介

P 3-5

四則運算子 + - * /

+ - * / 運算子與我們常用的數學運算方法相同,先讓我們來看下面的例子:

上述的運算結果是 4 。

因為負號的處理優先權高於乘號,所以會將 -2 乘上 3 得到 -6 , 接著 10 再與 -6 進行運算,最後即得到結果 4 。

Page 7: C語言 第三章 03 運算子、運算元與運算式

3 - 2 - 2 算術運算子 (3) 3- 2 運算子簡介

P 3-6

程式範例:四則運算子的說明與示範: CH03_01.c

Page 8: C語言 第三章 03 運算子、運算元與運算式

在第 14 行中變數 a 與 c 相除後,因為兩個整數相除,其結果不論是為整數或具有小數,都會將小數的部分捨去,

僅取整數的部分來儲存,雖然結果應該為 2.5 , 不過系統將小數部分捨去,所以最後輸出結果為整數 2 。

3 - 2 - 2 算術運算子 (3) 3- 2 運算子簡介

P 3-6

執行結果

程式解說

Page 9: C語言 第三章 03 運算子、運算元與運算式

int a=15,b=8;printf("%d",a%b); /* 執行結果為 7*/

3 - 2 - 2 算術運算子 (4) 3- 2 運算子簡介

P 3-7

餘數運算子 %

餘數運算子是計算兩數相除後的餘數,而且這兩個運算元必須為整數、短整數或長整數型態。

例如:

Page 10: C語言 第三章 03 運算子、運算元與運算式

3 - 2 - 2 算術運算子 (5) 3- 2 運算子簡介

P 3-7

程式範例: 餘數運算子 % 的說明與示範:CH03_02.c

Page 11: C語言 第三章 03 運算子、運算元與運算式

在第 8 行中,如果各位想在螢幕顯示出 % 餘數運算子,

必須要重覆兩次 % 字元。

執行結果

程式解說

3 - 2 - 2 算術運算子 (5) 3- 2 運算子簡介

P 3-7

Page 12: C語言 第三章 03 運算子、運算元與運算式

int a=-5; /* 使常數 5 為負數,並指定給整數變數 a*/int b=-3; /* 使常數 3 為負數,並指定給整數變數 b*/int b=-a; /* 將變數 a 的值加上負號,「負負得正」後,b 的值為 +5*/

3 - 2 - 2 算術運算子 (6) 3- 2 運算子簡介

P 3-7

正負號 + -

正負號運算子主要表示運算元的正 / 負值,通常設定常數為正數時可以省略 + 號,例如「 a=5 」與「 a=+5 」意義是相同的。

而負號除了使常數為負數外,也可以使得原來為負數的數值變成正數。

例如:

Page 13: C語言 第三章 03 運算子、運算元與運算式

++ 變數名稱 ;變數名稱 ++;

 

/* 宣告 a 與 b 為整數,初始值皆為 0*/b=a; /* 先將 a 值指定給 b ,此時 a 、 b 都是0*/a=a+1; //a 值加 1 ,但 b 值不變,此時a=1,b=0*/

int a=0,b=0;b=a++;

/* 宣告 a 與 b 為整數,初始值皆為 0*/a=a+1; /* 先將 a 值加 1 ,此時 a=1*/b=a; // 再將 a 值指定給 b ,此時 b=1*/

int a=0,b=0;b=++a;

執 行 順 序 說 明運算式

3 - 2 - 2 算術運算子 (7) 3- 2 運算子簡介

P 3-8

遞增運算子 ++ 遞增運算子為一元運算子,可用來將運算元內容值加1 。

下表說明了遞增運算子這兩種運作方式:

Page 14: C語言 第三章 03 運算子、運算元與運算式

-- 變數名稱 ;變數名稱 --;

/* 宣告 a 與 b 為整數,初始值皆為 0*/b=a; /* 先將 a 值指定給 b ,此時 a 、 b 都是0*/a=a-1; /*a 值減 1 ,但 b 值不變,此時a=-1,b=0*/

int a=0,b=0;b=a--;

/* 宣告 a 與 b 為整數,初始值皆為 0*/a=a-1; /* 先將 a 值減 1 ,此時 a=-1*/b=a; /* 將 a 值指定給 b ,此時 b=-1*/

int a=0,b=0;b=--a;

執 行 順 序 說 明運算式 

3 - 2 - 2 算術運算子 (8) 3- 2 運算子簡介

P 3-9

遞減運算子 --

遞減運算子與遞增運算子的格式與功能相仿,可將運算元內容值減 1 。

遞減運算子同樣具有兩種運作方式,如下表所 示:

Page 15: C語言 第三章 03 運算子、運算元與運算式

3 - 2 - 2 算術運算子 (9) 3- 2 運算子簡介

P 3-9

程式範例:遞增運算子與遞減運算

子的說明與示範:CH03_03.c

Page 16: C語言 第三章 03 運算子、運算元與運算式

3 - 2 - 2 算術運算子 (9) 3- 2 運算子簡介

在第 10 、 15 、 20 、 25 行,是說明前置與後置型遞增運 算子與遞減運算子的各種運算結果。

執行結果

程式解說

P 3-10

Page 17: C語言 第三章 03 運算子、運算元與運算式

a=5;b=a+3;

3 - 2 - 2 算術運算子 (10) 3- 2 運算子簡介

指定運算子指定運算子 (=) 會將右側的值指定給左邊的變數。

例如:

指定運算子也可以搭配某個運算子,而形成「複合指定運算子」( Compound Assignment Operators )。

複合指定運算子的格式如下:

a op= b;

P 3-10

Page 18: C語言 第三章 03 運算子、運算元與運算式

|=^=&=>>=<<=

%=/=*=-=+=

複合指定運算子

3 - 2 - 2 算術運算子 (10) 3- 2 運算子簡介

此運算式的含意是將 a 的值與 b 的值以 op 運算子進行計算,然後再將結果指定給 a 。

其中「 op= 」運算子,可以是以下 10 個運算子中的任何一個。

P 3-11

Page 19: C語言 第三章 03 運算子、運算元與運算式

3 - 2 - 2 算術運算子 (11) 3- 2 運算子簡介

P 3-11

程式範例:指定運算子的說明與示範:CH03_04.c

Page 20: C語言 第三章 03 運算子、運算元與運算式

3 - 2 - 2 算術運算子 (11) 3- 2 運算子簡介

在第 15 行的運算式「 a+=5 」相當於「 a=a+5 」,所以 a 的 數值變成 10 ( a=5+5 )。

在第 16 及 17 行中,因為複合指定運算子的右側還有運算式,所以會優先執行此運算式,然後再將運算結果與複合指定運算

子左側的變數進行運算,最後將結果指定給 b 及 c 。

執行結果

程式解說

P 3-12

Page 21: C語言 第三章 03 運算子、運算元與運算式

 

a!=b不等於!=

a==b等於==

a<=b小於等於<=

a>=b大於等於>=

a<b小於<

a>b大於>

用 法功 能運算子

int a=3,b=5;printf(“%d”,a<b); /*a(3) 小於 b(5) ,結果成立,輸出數值 1*/printf(“%d”,a>b); /*a(3) 大於 b(5) ,結果不成立,輸出數值 0*/

3 - 2 - 3 關係運算子 (1) 3- 2 運算子簡介

P 3-13

比較運算子共有六種,如下表所示:

例如:

Page 22: C語言 第三章 03 運算子、運算元與運算式

3 - 2 - 3 關係運算子 (2) 3- 2 運算子簡介

P 3-13

程式範例: 關係運算子的說明與示範: CH03_05.c

Page 23: C語言 第三章 03 運算子、運算元與運算式

3 - 2 - 3 關係運算子 (2) 3- 2 運算子簡介

P 3-14

第 08 、 10 與 12 行中分別利用關係運算子來比較兩個運算元的關係,並且分別輸出結果數值 1 與 0 。此外在第 12 行中,請注意比較運算子「 == 」和指定運算子「 = 」並不相同。「 = 」是用來指定運算元的值,而「 == 」是用在判斷式的等號關係中,兩者的功用並不相同。

執行結果

程式解說

Page 24: C語言 第三章 03 運算子、運算元與運算式

 

!(a>b)NOT!

a>b || a<cOR||

a>b && a<cAND&&

用 法功 能運算子 

3 - 2 - 4 邏輯運算子 (1) 3- 2 運算子簡介

P 3-14

邏輯運算子是運用在以判斷式來做為程式執行流程控制的時刻。

邏輯運算子判斷結果的輸出與比較運算子相同,僅有「真 (True) 」與「假 (False) 」兩種,並且分別可輸出數值「 1 」與「 0 」。

C 中的邏輯運算子共有三種,如下表所示:

Page 25: C語言 第三章 03 運算子、運算元與運算式

假假假假真假假假真真真真

a>b && a>c 的執行結果a > c 的真假值a > b 的真假值

 

3 - 2 - 4 邏輯運算子 (2) 3- 2 運算子簡介

P 3-15

&& 運算子

當 && 運算子 (AND) 兩邊的運算式皆為真 (true) 時,其執行結果才為真,任何一邊為假( flase )時,執行結果都為假。

例如運算式「 a>b && a>c 」,則執行結果有四種情形。

如下表所示 :

Page 26: C語言 第三章 03 運算子、運算元與運算式

3 - 2 - 4 邏輯運算子 (3) 3- 2 運算子簡介

P 3-15

|| 運算子

當 || 運算子 (OR) 兩邊的運算式,其中一邊為真 (true) 時,執行結果就為真,否則為假。

如下表所示 :

例如運算式「 a>b || a>c 」,則執行結果同樣有四種情形。

假假假真真假真假真

真真真a>b || a>c 的執行結果a > c 的真假值a > b 的真假

Page 27: C語言 第三章 03 運算子、運算元與運算式

 

3 - 2 - 4 邏輯運算子 (4) 3- 2 運算子簡介

P 3-15

! 運算子

這是一元運算子的一種,可以將運算式的結果變成相反值。

如下表所示 :

例如運算式「 !(a>b) 」,則執行結果有兩種情形。

真假假真

!(a > b) 的執行結果a > b 的真假值

Page 28: C語言 第三章 03 運算子、運算元與運算式

3 - 2 - 4 邏輯運算子 (5) 3- 2 運算子簡介

P 3-16

程式範例: 邏輯運算子的說明與示範: CH03_06.c

Page 29: C語言 第三章 03 運算子、運算元與運算式

3 - 2 - 4 邏輯運算子 (5) 3- 2 運算子簡介

P 3-17

在第 12 行中 a<b 且 b<c ,所以使用 && ( AND )運算子來計算這兩個運算式時,得到的結果為「真」( true ),因此

傳回值為 1 。在第 15 行中, a>b 運算式並不成立,傳回值應該為 0 ,不過

經過 NOT(!) 運算子計算後,結果改變為 1 ( true )。

執行結果

程式解說

Page 30: C語言 第三章 03 運算子、運算元與運算式

A>>nA 進行右移 n 個位元運算>>

A<<nA 進行左移 n 個位元運算<<

A^BA 與 B 進行 XOR 運算^

~AA 進行 NOT 運算~

A | BA 與 B 進行 OR 運算|

A & BA 與 B 進行 AND 運算&

使用語法說明位元運算子

3 - 2 - 5 位元運算子 (1) 3- 2 運算子簡介

P 3-17

運算元在記憶體中的值,實際上是採取二進位的形式。

C 語言中提供有六種二進位的位元運算子。

如下表所示 :

Page 31: C語言 第三章 03 運算子、運算元與運算式

int a=12;printf(“%d”,a&7); /* 輸出結果 4*/

3 - 2 - 5 位元運算子 (2) 3- 2 運算子簡介

P 3-18

& (AND)

執行 AND 運算時,對應的兩位元都為 true 時,運算結果才為true 。

例如 a=12 ,則「 a&7 」得到的結果為 4 。

因為 12 的二進位表示法為 1100 , 7 的二進位表示法為 0110 ,兩者執行 AND 運算後,結果為 (100) 2 也就是 (4) 10 。

下面以指令的方式來進行上述的位元運算。

例如:

Page 32: C語言 第三章 03 運算子、運算元與運算式

3 - 2 - 5 位元運算子 (3) 3- 2 運算子簡介

P 3-18

| (OR)

執行 OR 運算時,對應的兩位元只要任一位元為 true ,運算結果即為true 。

例如 a=12 ,則 a| 7 得到的結果為15 。

^ (XOR)

執行 XOR 運算時,對應的兩位元只要任一位元為 true ,則運算結果即為true 。

但是如果同時為 true 或 false ,則結果為false 。

例如 a=12 ,則 a^7 得到的結果為11 。

Page 33: C語言 第三章 03 運算子、運算元與運算式

a<<n

int a=12; /* 宣告變數 a 初始值為 12*/a<<=2; /*a 左移兩位元後成為 48 ,並將值存回 a 中 */printf(“%d\n”,a); /* 輸出 a 的值為 48*/

3 - 2 - 5 位元運算子 (4) 3- 2 運算子簡介

P 3-18

<< ( 左移) 左移運算子 (<<) 可將運算元內容向左移動 n 個位元,其格式如下:

<< 也可以和 = 號結合成 <<= 指定運算子。

<< 其運算過程先執行位元左移的動作,然後再將結果儲存回原來的變數中。

Page 34: C語言 第三章 03 運算子、運算元與運算式

a>>n

3 - 2 - 5 位元運算子 (5) 3- 2 運算子簡介

P 3-19

右移(>>) 右移運算子 (>>) 與左移相反,可將運算元內容右移 n 個位元,其格式如下:

~ (NOT)

NOT 是位元運算子較為特殊的一種,因為只需一個運算元即可運算。

執行結果則是把運算元內的每一個位元反相。 也就是原本 1 的值變成 0 , 0 的值變成

1 。 例如 a=12 ,則 (~a) 得到的結果為

-13 。

Page 35: C語言 第三章 03 運算子、運算元與運算式

3 - 2 - 5 位元運算子 (6) 3- 2 運算子簡介

P 3-19

程式範例: 位元運算子的說明與示範: CH03_07.c

Page 36: C語言 第三章 03 運算子、運算元與運算式

3 - 2 - 5 位元運算子 (6) 3- 2 運算子簡介

P 3-20

在本程式中主要是使用整數變數 (bit_test=12) 來執行各項 位元運算子的功能,並以十進位整數顯示結果。

執行結果

程式解說

Page 37: C語言 第三章 03 運算子、運算元與運算式

判斷式 ? 結果為真的值 : 結果為假的值

(a>b?1:-1)

3 - 2 - 6 條件運算子 (1) 3- 2 運算子簡介

P 3-20

條件運算子( ?: )是 C語言中唯一的「三元運算子」,它可以藉由判斷式的真假值,來傳回指定的值。

其使用語法如下所示:

例如:

Page 38: C語言 第三章 03 運算子、運算元與運算式

3 - 2 - 6 條件運算子 (2) 3- 2 運算子簡介

P 3-21

程式範例: 條件運算子的說明與示範: CH03_08.c

Page 39: C語言 第三章 03 運算子、運算元與運算式

3 - 2 - 6 條件運算子 (2) 3- 2 運算子簡介

P 3-21

在第 13 行的條件式中使用 && ( AND )運算子,來判斷兩科目的 成績是否都超過 60 分。

結果由於 int_physical 變數內容值未超過 60 ,因此判斷式的結果為「假」( false ),所以傳回「 : 」符號後的字元「 N 」,並且指定給 chr_pass 變數。

執行結果

程式解說

Page 40: C語言 第三章 03 運算子、運算元與運算式

double fmod(double x,double y);

3 - 3 上機實習課程 (1) 3- 3 上機實習課程

P 3-22

上機實習範例: CH03_09.c

以下程式範例是餘數運算子的實作,不過 % 運算子兩端的兩個運算元都必須是整數,請求取 125對 4 、 5 、 6 的餘數運算。

另外如果要求取實數間的餘數運算,可利用 fmod()函數:

Page 41: C語言 第三章 03 運算子、運算元與運算式

3 - 3 上機實習課程 (1) 3- 3 上機實習課程

P 3-22

上機實習範例: CH03_09.c

執行結果

Page 42: C語言 第三章 03 運算子、運算元與運算式

3 - 3 上機實習課程 (2) 3- 3 上機實習課程

P 3-23

上機實習範例: CH03_10.c

執行結果

Page 43: C語言 第三章 03 運算子、運算元與運算式

3 - 3 上機實習課程 (3) 3- 3 上機實習課程

P 3-24

上機實習範例: CH03_11.c

左移運算子 (<<) 可將運算元內容向左移動 n 個位元,右移運算子(>>) 則可將運算元內容右移 n 個位元,請設計一程式求取 168向左移 5 個位元後,再右移 5 個位元後的值。

執行結果

Page 44: C語言 第三章 03 運算子、運算元與運算式

a||b&&!a|!b(!a||b)-(a&&!b||!a)

3 - 3 上機實習課程 (4) 3- 3 上機實習課程

P 3-25

上機實習範例: CH03_12.c

已知兩數 a=0,b=0 ,請設計一程式來求取下兩關係運算式的值:

Page 45: C語言 第三章 03 運算子、運算元與運算式

3 - 3 上機實習課程 (1) 3- 3 上機實習課程

P 3-25

上機實習範例: CH03_12.c

執行結果

Page 46: C語言 第三章 03 運算子、運算元與運算式

a-b%6+12*b/2(a*5)%8/5-2*b)(a%8)/12*6+12-b/2

3 - 3 上機實習課程 (5) 3- 3 上機實習課程

P 3-22

上機實習範例: CH03_13.c

請計算下列各式,並撰寫以下程式來驗證最後的計算結果:

Page 47: C語言 第三章 03 運算子、運算元與運算式

3 - 3 上機實習課程 (5) 3- 3 上機實習課程

上機實習範例: CH03_13.c

執行結果

P 3-25