Upload
shademoon
View
16.583
Download
4
Embed Size (px)
Citation preview
王智祥
著
第三章 運算子、運算元 與運算式
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 上機實習課程
3-1-1 運算式的分類
下面簡單介紹這些運算式的特性與範例:
3- 1 運算式簡介
P 3-2
一元運算式: 由一元運算子所組成的運算式,在運算子左側或右側僅有一個運算元。
例如 -100 (負數)、 tmp-- (遞減)、 sum++ (遞增)等。
二元運算式: 由二元運算子所組成的運算式,在運算子兩側都有運算元。 例如 A+B (加)、 A=10 (等於)、 x+=y (遞增等於)等
。
三元運算式: 由三元運算子所組成的運算式。由於此類型的運算子僅有「 :? 」 「條件運算子」,因此三元運算式又稱為「條件運算式」。
例如, a>b?’ Y’ :’ N’ 。
1. 當遇到一個運算式時,先區分運算子與運算元。
3 - 2 - 1 運算子優先順序 3- 2 運算子簡介
P 3-4
在處理一個多運算子的運算式時,有一些規則與步驟是必須要遵守,如下所示:
2. 依照運算子的優先順序作整理的動作。
3. 將各運算子根據其結合順序進行運算。
說 明運算子
指定運算=
條件運算子?:
邏輯運算 AND邏輯運算 OR
&&||
位元運算 AND位元運算 XOR位元運算 OR
&^|
比較運算等於比較運算不等於
==!=
比較運算大於比較運算大於等於比較運算小於比較運算小於等於
>>=<
<=
3 - 2 - 1 運算子優先順序 3- 2 運算子簡介
P 3-4
以下是 C 中各種運算子計算的優先順序 :
邏輯運算 NOT負號遞增運算遞減運算
!-
++--
括號()
說 明運算子
位元左移運算位元右移運算
<<>>
加法運算減法運算
+-
乘法運算除法運算餘數運算
*/
%
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
算術運算子的符號與名稱如下表所示:
10 – 2 * 3
3 - 2 - 2 算術運算子 (2) 3- 2 運算子簡介
P 3-5
四則運算子 + - * /
+ - * / 運算子與我們常用的數學運算方法相同,先讓我們來看下面的例子:
上述的運算結果是 4 。
因為負號的處理優先權高於乘號,所以會將 -2 乘上 3 得到 -6 , 接著 10 再與 -6 進行運算,最後即得到結果 4 。
3 - 2 - 2 算術運算子 (3) 3- 2 運算子簡介
P 3-6
程式範例:四則運算子的說明與示範: CH03_01.c
在第 14 行中變數 a 與 c 相除後,因為兩個整數相除,其結果不論是為整數或具有小數,都會將小數的部分捨去,
僅取整數的部分來儲存,雖然結果應該為 2.5 , 不過系統將小數部分捨去,所以最後輸出結果為整數 2 。
3 - 2 - 2 算術運算子 (3) 3- 2 運算子簡介
P 3-6
執行結果
程式解說
int a=15,b=8;printf("%d",a%b); /* 執行結果為 7*/
3 - 2 - 2 算術運算子 (4) 3- 2 運算子簡介
P 3-7
餘數運算子 %
餘數運算子是計算兩數相除後的餘數,而且這兩個運算元必須為整數、短整數或長整數型態。
例如:
3 - 2 - 2 算術運算子 (5) 3- 2 運算子簡介
P 3-7
程式範例: 餘數運算子 % 的說明與示範:CH03_02.c
在第 8 行中,如果各位想在螢幕顯示出 % 餘數運算子,
必須要重覆兩次 % 字元。
執行結果
程式解說
3 - 2 - 2 算術運算子 (5) 3- 2 運算子簡介
P 3-7
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 」意義是相同的。
而負號除了使常數為負數外,也可以使得原來為負數的數值變成正數。
例如:
++ 變數名稱 ;變數名稱 ++;
/* 宣告 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 。
下表說明了遞增運算子這兩種運作方式:
-- 變數名稱 ;變數名稱 --;
/* 宣告 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 。
遞減運算子同樣具有兩種運作方式,如下表所 示:
3 - 2 - 2 算術運算子 (9) 3- 2 運算子簡介
P 3-9
程式範例:遞增運算子與遞減運算
子的說明與示範:CH03_03.c
3 - 2 - 2 算術運算子 (9) 3- 2 運算子簡介
在第 10 、 15 、 20 、 25 行,是說明前置與後置型遞增運 算子與遞減運算子的各種運算結果。
執行結果
程式解說
P 3-10
a=5;b=a+3;
3 - 2 - 2 算術運算子 (10) 3- 2 運算子簡介
指定運算子指定運算子 (=) 會將右側的值指定給左邊的變數。
例如:
指定運算子也可以搭配某個運算子,而形成「複合指定運算子」( Compound Assignment Operators )。
複合指定運算子的格式如下:
a op= b;
P 3-10
|=^=&=>>=<<=
%=/=*=-=+=
複合指定運算子
3 - 2 - 2 算術運算子 (10) 3- 2 運算子簡介
此運算式的含意是將 a 的值與 b 的值以 op 運算子進行計算,然後再將結果指定給 a 。
其中「 op= 」運算子,可以是以下 10 個運算子中的任何一個。
P 3-11
3 - 2 - 2 算術運算子 (11) 3- 2 運算子簡介
P 3-11
程式範例:指定運算子的說明與示範:CH03_04.c
3 - 2 - 2 算術運算子 (11) 3- 2 運算子簡介
在第 15 行的運算式「 a+=5 」相當於「 a=a+5 」,所以 a 的 數值變成 10 ( a=5+5 )。
在第 16 及 17 行中,因為複合指定運算子的右側還有運算式,所以會優先執行此運算式,然後再將運算結果與複合指定運算
子左側的變數進行運算,最後將結果指定給 b 及 c 。
執行結果
程式解說
P 3-12
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
比較運算子共有六種,如下表所示:
例如:
3 - 2 - 3 關係運算子 (2) 3- 2 運算子簡介
P 3-13
程式範例: 關係運算子的說明與示範: CH03_05.c
3 - 2 - 3 關係運算子 (2) 3- 2 運算子簡介
P 3-14
第 08 、 10 與 12 行中分別利用關係運算子來比較兩個運算元的關係,並且分別輸出結果數值 1 與 0 。此外在第 12 行中,請注意比較運算子「 == 」和指定運算子「 = 」並不相同。「 = 」是用來指定運算元的值,而「 == 」是用在判斷式的等號關係中,兩者的功用並不相同。
執行結果
程式解說
!(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 中的邏輯運算子共有三種,如下表所示:
假假假假真假假假真真真真
a>b && a>c 的執行結果a > c 的真假值a > b 的真假值
3 - 2 - 4 邏輯運算子 (2) 3- 2 運算子簡介
P 3-15
&& 運算子
當 && 運算子 (AND) 兩邊的運算式皆為真 (true) 時,其執行結果才為真,任何一邊為假( flase )時,執行結果都為假。
例如運算式「 a>b && a>c 」,則執行結果有四種情形。
如下表所示 :
3 - 2 - 4 邏輯運算子 (3) 3- 2 運算子簡介
P 3-15
|| 運算子
當 || 運算子 (OR) 兩邊的運算式,其中一邊為真 (true) 時,執行結果就為真,否則為假。
如下表所示 :
例如運算式「 a>b || a>c 」,則執行結果同樣有四種情形。
假假假真真假真假真
真真真a>b || a>c 的執行結果a > c 的真假值a > b 的真假
值
3 - 2 - 4 邏輯運算子 (4) 3- 2 運算子簡介
P 3-15
! 運算子
這是一元運算子的一種,可以將運算式的結果變成相反值。
如下表所示 :
例如運算式「 !(a>b) 」,則執行結果有兩種情形。
真假假真
!(a > b) 的執行結果a > b 的真假值
3 - 2 - 4 邏輯運算子 (5) 3- 2 運算子簡介
P 3-16
程式範例: 邏輯運算子的說明與示範: CH03_06.c
3 - 2 - 4 邏輯運算子 (5) 3- 2 運算子簡介
P 3-17
在第 12 行中 a<b 且 b<c ,所以使用 && ( AND )運算子來計算這兩個運算式時,得到的結果為「真」( true ),因此
傳回值為 1 。在第 15 行中, a>b 運算式並不成立,傳回值應該為 0 ,不過
經過 NOT(!) 運算子計算後,結果改變為 1 ( true )。
執行結果
程式解說
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 語言中提供有六種二進位的位元運算子。
如下表所示 :
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 。
下面以指令的方式來進行上述的位元運算。
例如:
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 。
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 個位元,其格式如下:
<< 也可以和 = 號結合成 <<= 指定運算子。
<< 其運算過程先執行位元左移的動作,然後再將結果儲存回原來的變數中。
a>>n
3 - 2 - 5 位元運算子 (5) 3- 2 運算子簡介
P 3-19
右移(>>) 右移運算子 (>>) 與左移相反,可將運算元內容右移 n 個位元,其格式如下:
~ (NOT)
NOT 是位元運算子較為特殊的一種,因為只需一個運算元即可運算。
執行結果則是把運算元內的每一個位元反相。 也就是原本 1 的值變成 0 , 0 的值變成
1 。 例如 a=12 ,則 (~a) 得到的結果為
-13 。
3 - 2 - 5 位元運算子 (6) 3- 2 運算子簡介
P 3-19
程式範例: 位元運算子的說明與示範: CH03_07.c
3 - 2 - 5 位元運算子 (6) 3- 2 運算子簡介
P 3-20
在本程式中主要是使用整數變數 (bit_test=12) 來執行各項 位元運算子的功能,並以十進位整數顯示結果。
執行結果
程式解說
判斷式 ? 結果為真的值 : 結果為假的值
(a>b?1:-1)
3 - 2 - 6 條件運算子 (1) 3- 2 運算子簡介
P 3-20
條件運算子( ?: )是 C語言中唯一的「三元運算子」,它可以藉由判斷式的真假值,來傳回指定的值。
其使用語法如下所示:
例如:
3 - 2 - 6 條件運算子 (2) 3- 2 運算子簡介
P 3-21
程式範例: 條件運算子的說明與示範: CH03_08.c
3 - 2 - 6 條件運算子 (2) 3- 2 運算子簡介
P 3-21
在第 13 行的條件式中使用 && ( AND )運算子,來判斷兩科目的 成績是否都超過 60 分。
結果由於 int_physical 變數內容值未超過 60 ,因此判斷式的結果為「假」( false ),所以傳回「 : 」符號後的字元「 N 」,並且指定給 chr_pass 變數。
執行結果
程式解說
double fmod(double x,double y);
3 - 3 上機實習課程 (1) 3- 3 上機實習課程
P 3-22
上機實習範例: CH03_09.c
以下程式範例是餘數運算子的實作,不過 % 運算子兩端的兩個運算元都必須是整數,請求取 125對 4 、 5 、 6 的餘數運算。
另外如果要求取實數間的餘數運算,可利用 fmod()函數:
3 - 3 上機實習課程 (1) 3- 3 上機實習課程
P 3-22
上機實習範例: CH03_09.c
執行結果
3 - 3 上機實習課程 (2) 3- 3 上機實習課程
P 3-23
上機實習範例: CH03_10.c
執行結果
3 - 3 上機實習課程 (3) 3- 3 上機實習課程
P 3-24
上機實習範例: CH03_11.c
左移運算子 (<<) 可將運算元內容向左移動 n 個位元,右移運算子(>>) 則可將運算元內容右移 n 個位元,請設計一程式求取 168向左移 5 個位元後,再右移 5 個位元後的值。
執行結果
a||b&&!a|!b(!a||b)-(a&&!b||!a)
3 - 3 上機實習課程 (4) 3- 3 上機實習課程
P 3-25
上機實習範例: CH03_12.c
已知兩數 a=0,b=0 ,請設計一程式來求取下兩關係運算式的值:
3 - 3 上機實習課程 (1) 3- 3 上機實習課程
P 3-25
上機實習範例: CH03_12.c
執行結果
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
請計算下列各式,並撰寫以下程式來驗證最後的計算結果:
3 - 3 上機實習課程 (5) 3- 3 上機實習課程
上機實習範例: CH03_13.c
執行結果
P 3-25