Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

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

18,070 views

Published on

  • Be the first to comment

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

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

×