程式設計 博碩文化出版發行
第四章 運算子與運算式 課前指引 在C語言中,運算元包括了常數、變數、函數呼叫或其他運算式,而運算子的種類相當多,有指派運算子、算術運算子、比較運算子、邏輯運算子、遞增遞減運算子,以及位元運算子等六種。
章節大綱 4-1 運算式簡介 4-2 認識運算子 備註:可依進度點選小節
4-1 運算式簡介 在程式語言的領域中,如果依據運算子在運算式中的位置,可區分以下三種表示法: 中序法(Infix):運算子在兩個運算元中間,例如A+B、(A+B)*(C+D)等都是中序表示法。 前序法(Prefix):運算子在運算元的前面,例如+AB、*+AB+CD等都是前序表示法。 後序法(Postfix):運算子在運算元的後面,例如AB+、AB+CD+*等都是後序表示法。
4-1 運算式簡介 運算式分類 一元運算式:由一元運算子所組成的運算式,在運算子左側或右側僅有一個運算元。例如-100(負數)、tmp--(遞減)、sum++(遞增)等。 二元運算式:由二元運算子所組成的運算式,在運算子兩側都有運算元。例如A+B(加)、A=10(等於)、x+=y(遞增等於)等。 三元運算式:由三元運算子所組成的運算式。由於此類型的運算子僅有「? :」(條件)運算子,因此三元運算式又稱為「條件運算式」。 例如 a>b ? ‘Y‘ : ’N’。 語意:若a>b成立,則回傳字元Y;若否,則回傳字元N
4-1 運算式簡介 運算式中資料型態的自動轉換 運算式中會依照數值範圍大者作為轉換的類型 例如:整數型態會自動轉成浮點數型態 float x; x = 2 + 3.14159; 比較 int x; 如果指定敘述「=」兩邊的型態不同,會一律轉換成與左邊變數相同的型態。當然在這種情形下,要注意執行結果可能會有所改變,例如例如將double型態指定給short型態,可能會有遺失小數點後的精準度。
4-1 運算式簡介 範例CH04_01.c /*資料型態的 自動轉換*/
4-1 運算式簡介 執行結果
4-1 運算式簡介 程式解說 第7~11行宣告不同資料型態的變數。 第13行將整數100與字元c相加,並儲存到整數變數i中,字元變數c會轉成ASCII碼進行相加。 第15行將整數i與單精度浮點數f加法運算後,存入倍精度浮點數d,由第18行中的輸出可以看見d佔了8個位元組,就是我們所強調的運算結果會一律轉換成與左邊變數相同的型態。 第20行則是把d的值設定給短整數sum,因此在第22行輸出時會把小數點後得資料去掉。
4-2 認識運算子 前言 運算子的種類相當多,分門別類的執行各種計算功能,例如指派運算子、算術運算子、比較運算子、邏輯運算子、遞增遞減運算子,以及位元運算子等。 一個運算式中往往包含了許多運算子,如何來安排彼此間執行的先後順序,就需要依據優先權來建立運算規則了。
4-2 認識運算子 運算子計算的優先順序 (續) 運算子優先順序 說明 () 括號,由左至右。 〔〕 方括號,由左至右。 ! - ++ -- 邏輯運算NOT 負號 遞增運算 遞減運算,由右至左。 ~ 位元邏輯運算子,由右至左。 ++、-- 遞增與遞減運算子,由右至左。 * / % 乘法運算 除法運算 餘數運算,由左至右。 + 加法運算 減法運算,由左至右。 << >> 位元左移運算 位元右移運算,由左至右。
4-2 認識運算子 運算子計算的優先順序 運算子優先順序 說明 > >= < <= 比較運算大於 比較運算大於等於 比較運算小於 比較運算小於等於 == != 比較運算等於 比較運算不等於,由左至右。 & ^ | 位元運算AND,由左至右。 位元運算XOR 位元運算OR,由左至右。 && || 邏輯運算AND 邏輯運算OR,由左至右。 ?: 條件運算子,由右至左。 = 指定運算,由右至左。
4-2 認識運算子 範例CH04_02.c /*運算子的優先順序*/
4-2 認識運算子 執行結果 程式解說 第7行宣告整數變數sum。 第9行計算此運算式,並將此結果儲存在sum中,這運算式將根據C的運算子優先權順序來進行。 第10行使用%%方式輸出%運算子。
4-2 認識運算子 指定運算子 其實「=」主要是當做「指定」 (assign)的功能,各位可以想像成當宣告變數時會先在記憶體上安排位址,等到利用指定運算子(=)設定數值時,才將數值指定給該位址來儲存。 「=」指定運算子,由至少兩個運算元組成,主要作用是將等號右方的值指派給等號左方的變數。
4-2 認識運算子 範例CH04_03.c /*「=」之使用*/
4-2 認識運算子 執行結果 程式解說 第9行請輸入一個整數值,儲存在sum變數中。 第10行將sum的值加1,並重新儲存在sum中。
4-2 認識運算子 算術運算子 算術運算子是最常用的運算子類型。其符號與名稱如下表 運算子 說明 使用語法 執行結果(A=25,B=7) + 加 A + B 25+7=32 - 減 A - B 25-7=18 * 乘 A * B 25*7=175 / 除 A / B 25/7=3 % 取餘數 A % B 25%7=4 正號 +A +25 負號 -B -7
4-2 認識運算子 範例CH04_04.c /* 「+, ─, *, /, %」之使用*/
4-2 認識運算子 執行結果 程式解說 第8 行中分別輸入a與b的值。 第11~13行將a與b值直接代入運算式,在此各位可仔細觀察我們在printf()函數中格式化字串的寫法。 不要忘了,如果想在螢幕顯示出%字元,必須要重覆兩次%字元。
4-2 認識運算子 範例CH04_05.c /*「%」之使用*/
4-2 認識運算子 執行結果 程式解說 第8行當125除以4時,餘數為1。 而第9行125除以5時,餘數正好為0。 第10行除以6時,餘數正好為5。
4-2 認識運算子 關係運算子 關係運算子主要是在比較兩個數值之間的大小關係,共有六種,如下表所示。 關係運算子 功能說明 用法 A=15,B=2 > 大於 A>B 15>2,結果為true(1)。 < 小於 A<B 15<2,結果為false(0)。 >= 大於等於 A>=B 15>=2,結果為true(1)。 <= 小於等於 A<=B 15<=2,結果為false(0)。 == 等於 A==B 15==2,結果為false(0)。 != 不等於 A!=B 15!=2,結果為true(1)。
4-2 認識運算子 範例CH04_06.c /*關係運算子之使用*/
4-2 認識運算子 執行結果 程式解說 第5行:宣告a、b的值。
4-2 認識運算子 範例CH04_07.c /*數字0代表偽,其餘皆為真*/
4-2 認識運算子 執行結果 程式解說 第6行因為判斷式中為1,所以執行第7行指令。 第8行if(-5)為真,則執行第9行指令。
4-2 認識運算子 邏輯運算子 邏輯運算子也是運用在邏輯判斷的時候,可控制程式的流程,通常是用在兩個表示式之間的關係判斷 。 運算子 功能 用法 && AND a>b && a<c || OR a>b || a<c ! NOT !(a>b)
4-2 認識運算子 邏輯運算子 || (或)運算子 || 邏輯運算子 A 1 B
4-2 認識運算子 邏輯運算子 && (且) 運算子 && 邏輯運算子 A 1 B
4-2 認識運算子 邏輯運算子 ! (否)運算子 A 1 !運算子
4-2 認識運算子 範例CH04_08.c /*邏輯運算子之使用*/
4-2 認識運算子 執行結果 程式解說 第7行宣告a、b及c三個整數變數,並設定不同的值。 第12行當連續使用邏輯運算子時,它的計算順序為由左至右,也就是先計算「a<b && b<c」,然後再將結果與「c<a」進行OR的運算。 第13行則由括號內先進行,在由左而右依序進行。
4-2 認識運算子 位元運算子 區分為「位元邏輯運算子」與「位元位移運算子」兩種。 位元邏輯運算子 位元位移運算子 有 & (AND)、 | (OR)、 ^ (XOR) ~ (NOT) 位元位移運算子 有 左移運算子(<<) 右移運算子(>>)
4-2 認識運算子 位元邏輯運算子 &(AND;且) 執行AND運算時,對應的兩字元都為1時,運算結果才為1,否則為0。 例如:a=12,則a&38得到的結果為4,因為12的二進位表示法為1100,38的二進位表示法為0110,兩者執行AND運算後,結果為十進位的4。如下圖所示:
4-2 認識運算子 位元邏輯運算子 |(OR;或) 例如a=12,則a|38得到的結果為46,如下圖所示:
4-2 認識運算子 位元邏輯運算子 ^(XOR) 執行XOR運算時,對應的兩字元只有任一字元為1時,運算結果為1,但是如果同時為1或0時,結果為0。 例如a=12,則a^38得到的結果為42,如下圖所示:
4-2 認識運算子 位元邏輯運算子 ~(NOT) NOT作用是取補數(complement),也就是0與1互換。 例如a=12,二進位表示法為1100,取1的補數後,由於所有位元都會進行0與1互換,因此運算後的結果得到-13:
4-2 認識運算子 範例CH04_09.c /*位元邏輯運算子之使用*/
4-2 認識運算子 執行結果 程式解說 第6行宣告a=12,b=38。 第8行輸出a與b AND運算後的結果。 第9行輸出a與b OR運算後的結果。 第10行輸出a與b XOR運算後的結果。 第11行輸出a NOT運算後的結果。
4-2 認識運算子 位元位移運算子 <<(左移) 左移運算子(<<)可將運算元內容向左移動n個位元,左移後超出儲存範圍即捨去,右邊空出的位元則補0。語法格式如下: 例如運算式「12<<2」。數值12的二進位值為1100,向左移動2個位元後成為110000,也就是十進位的48。如下圖所示。 a<<n
4-2 認識運算子 位元位移運算子 >>(右移) 右移運算子(>>)與左移相反,可將運算元內容右移n個位元,右移後超出儲存範圍即捨去。 在此請注意,這時右邊空出的位元,如果數值是正數則補0,負數則填1。語法格式如下: 例如運算式「12>>2」。數值12的二進位值為1100,向右移動2個位元後成為0011,也就是十進位的3。如下圖所示。 a>>n
4-2 認識運算子 範例CH04_10.c /*「<<」,「 >>」之使用*/
4-2 認識運算子 執行結果 程式解說 6行宣告a=12,二進位表示法為00001100。 第9行左移2位運算,第10行右移2位運算。 第13行左移2位運算,第14行右移2位運算。
4-2 認識運算子 遞增與遞減運算子 分成「前置型」及「後置型」兩種,屬於一元運算子的一種 ,可分為底下兩種: 遞增運算子++ 遞減運算子--
4-2 認識運算子 遞增運算子++ 遞增運算子可放在字元的前方或後方,下表說明了遞增運算子(++)兩種格式的運作方式: 運算式 執行順序說明 int a=0,b=0; b=++a; /*宣告a與b為整數,初始值皆為0*/ a=a+1; /*先將a值加1,此時a=1*/ b=a; /*再將a值指定給b,此時b=1*/ b=a++; b=a; /*先將a值指定給b,此時a、b都是0*/ a=a+1; /*a值加1,但b值不變,此時a=1,b=0*/
4-2 認識運算子 遞減運算子-- 遞減運算子與遞增運算子功能相仿,不同的位置則會產生截然不同的計算順序如下表: 運算式 執行順序說明 int a=0,b=0; b=--a; /*宣告a與b為整數,初始值皆為0*/ a=a-1; /*先將a值減1,此時a=-1*/ b=a; /*將a值指定給b,此時b=-1*/ b=a--; b=a; /*先將a值指定給b,此時a、b都是0*/ a=a-1; /*a值減1,但b值不變,此時a=-1,b=0*/
4-2 認識運算子 範例 CH04_11.c /* 「++」, 「--」之使用 */
4-2 認識運算子 執行結果
4-2 認識運算子 程式解說 7行宣告a=15,第9行使用前置型遞增運算子,所以此時b=16。 第10行輸出時,a=16、b=16。
4-2 認識運算子 複合指定運算子 運算子 說明 使用語法 += 加法指定運算 A += B -= 減法指定運算 A -= B *= 乘法指定運算 A *= B /= 除法指定運算 A /= B %= 餘數指定運算 A %= B &= AND位元指定運算 A &= B |= OR位元指定運算 A |= B ^= NOT位元指定運算 A ^= B <<= 位元左移指定運算 A <<= B >>= 位元右移指定運算 A >>= B
4-2 認識運算子 範例CH04_12.c /*「*=」,「+=」 , 「%=」 ,「-=」之使用*/
4-2 認識運算子 執行結果 程式解說 第6~7行宣告多個變數與設定初始值。 第12行利用複合指定運算子,計算下列算式,運算時必須是由右方開始,依序逐步進行到左方。
本章結束 Q&A討論時間