第3章數(shù)據(jù)運算 第2版 08屆.ppt_第1頁
第3章數(shù)據(jù)運算 第2版 08屆.ppt_第2頁
第3章數(shù)據(jù)運算 第2版 08屆.ppt_第3頁
第3章數(shù)據(jù)運算 第2版 08屆.ppt_第4頁
第3章數(shù)據(jù)運算 第2版 08屆.ppt_第5頁
已閱讀5頁,還剩44頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領

文檔簡介

1、第三章 數(shù)據(jù)運算,3.1 算術運算 3.2 賦值運算 3.3 逗號運算(順序運算) 3.4 關系運算和邏輯運算 3.5 測試數(shù)據(jù)長度運算符 sizeof 3.6 位運算 3.7 常用數(shù)學函數(shù),運算規(guī)則,運算符的結(jié)合方向 即同級運算符相鄰時的運算次序,運算符的優(yōu)先級 即不同級運算符相鄰時的運算次序,重點掌握:,3.1 算術運算 p270 附錄1 運算符集,運算符必須連接兩(一)個運算,稱為二(一) 元運算,一. 算術運算符的運算規(guī)則說明,兩個整數(shù)相除,結(jié)果為整數(shù)(截尾取整) 兩個浮點數(shù)相除,結(jié)果為浮點數(shù),1. % 取余運算(求模運算),a%b 是指兩數(shù)的絕對值做整除得到的余數(shù),符號與a 相同,2

2、,2,-2,-2,2. / 除法運算,2,2.5 5.0為浮點數(shù),參加 % 運算的兩個運算數(shù)必須是整數(shù),3. + 加1 (自增運算) 和 - -減 1(自減運算),功能:將變量的值 加1 或 減 1,前綴運算與后綴運算的異同, 如果單獨對一個變量施加前綴或后綴運算,運算結(jié)果相同, 如果對變量施加了前綴或后綴運算,同時參與其它運算,則 前綴運算:先自增(減)后取值(后參加運算) 后綴運算:先取值 (先參加運算) 后自增(減),例3.1 P38 L3-1.c,zz1.c,zz2.c,例:3.2 p39 L3-2.c,二. 算術表達式,1. 定義 書寫規(guī)則 p38,用算術運算符連接數(shù)值型運算量而得到

3、的式子。,例: -4.5*5/3+2.4,(a+)*b%c,2. 算術表達式的數(shù)據(jù)類型,即算術表達式的運算結(jié)果的類型。,例: 3+7%4-5/3 結(jié)果為 int 型 1.0/2.0*2.3 結(jié)果為 double 型 3+2.5*3 結(jié)果為 ? 型 (參加運算數(shù)據(jù)類型不同) a+5 結(jié)果為 ? 型 (參加運算數(shù)據(jù)類型不同),3. 自動類型轉(zhuǎn)換規(guī)則 (關于算術表達式的數(shù)據(jù)類型的說明),兩個同類型的數(shù)據(jù)參加運算,結(jié)果也是同類型;,兩個不同類型的數(shù)據(jù)參加運算, C系統(tǒng)自動將它們轉(zhuǎn)換為較高級別進行處理,結(jié)果也為較高級別。 即把長度較短的類型轉(zhuǎn)換為長度較長的類型,以保證不丟失精度。,類型級別為:,轉(zhuǎn)換規(guī)則

4、 見p40 表3.1 (注意:符號擴展) p39 例3.3 (L3-3.c),3.5 測試數(shù)據(jù)長度運算符 sizeof,一般格式,例3.13 P49 L3-13.c,sizeof(exp),功能:計算出exp所占字節(jié)數(shù)。,表3.1 低精度類型轉(zhuǎn)換高精度類型 見p40,低精度類型 高精度類型 轉(zhuǎn)換說明 Char unsigned char 將char的符號位視為數(shù)值位 Char int (32位) 將char的8位作為int的低8位, 高24位符號擴展 unsigned char int 將char的8位作為int的低8位,高24位補0 int unsigned int (32位) 將int的符

5、號位視為數(shù)值位 unsigned int long int 將unsigned的最高位位,視為符號位 int float 將int 用浮點表示 float double 將float的尾數(shù)和階碼分別 作為 double的尾數(shù)和階碼 符號擴展:負數(shù)的高位全補1,正數(shù)的高位全補0 轉(zhuǎn)換規(guī)則:低位保持,高位補0或符號擴展,/* L3-3.c */ main() char ch=a; int i=5; unsigned int j=6; long int k=12; float f=3.0; double d=6.0; printf(%fn,ch/i+i*k-(j+k)*(f*d)/(f+i); ,/

6、* L3-3.c */ main() /* 計算過程:*/ char ch=a; /* 計算(j+k) 值 18 long int */ int i=5; /* 計算(f*d) 值 18.0 double */ unsigned int j=6; /* 計算(f+i) 值 8.0 float */ long int k=12; /* 計算ch/i 值 19 int */ float f=3.0; /* 計算i*k 值 60 long int */ double d=6.0; /* 計算(j+k)*(f*d) 值 324.0 double*/ printf(%fn,ch/i+i*k-(j+k)*

7、(f*d)/(f+i); /* 計算(j+k)*(f*d)/(f+i) 值 40.5 double */ /* 計算ch/i+i*k 值 79 long int */ /* 計算ch/i+i*k-(j+k)*(f*d)/(f+i) 值 38.5 double */,4. 強制類型轉(zhuǎn)換,一般格式,(類型關鍵字) (表達式),功能:將表達式的值強制轉(zhuǎn)換為指定的類型。,使用說明, 類型關鍵字必須用括號括??;, 對一個表達式進行強制類型轉(zhuǎn)換時,表達式必須寫在 括號內(nèi);, 如果要將低精度轉(zhuǎn)換為高精度時,仍按表3.1的規(guī)則; 如果要將高精度轉(zhuǎn)換為底精度時,按 p41 表3.2的規(guī)則 。,例:(int)6.

8、7 (float)(3/2) (int)(3.0/2.0),結(jié)果為: 6 1.5 1,例3.4 (P41 L3-4.c),表3.2 高精度類型向低精度類型轉(zhuǎn)換規(guī)則 見p41,高精度類型 低精度類型 轉(zhuǎn)換說明 unsigned char char 將最高位視為符號位 int unsigned char 截去int高24位,低8位按無符號處理 Short int (16位) char 截去int的高8位,低8位按有符號處理 int char 截去int的高24位,低8位按有符號處理 unsigned int int 將最高位視為符號位 float int 截去float的小數(shù)部分 double f

9、loat 將double 的多余小數(shù)部分四舍五入 轉(zhuǎn)換規(guī)則:截高位,3.2 賦值運算,例: a+=3;相當于 a=a+3; a-=3;相當于 a=a-3; b*=5;相當于 b=b*5; b/=3;相當于 b=b/3; a%=3*4; 相當于 a=a%(3*4); 注意:復合賦值運算時,將賦值號右邊的運算視為一個整體,賦值表達式,賦值號的左側(cè)必須是變量;,1. 賦值表達式的一般格式,變量 = 表達式,2. 關于賦值表達式的說明,賦值號左側(cè)變量的類型是整個賦值表達式的類型、左側(cè)變量的值是整個賦值表達式的值;,左側(cè)變量的類型與右側(cè)表達式的類型不一致時,先計算右側(cè)表達式的值,然后自動轉(zhuǎn)換為左側(cè)變量的

10、類型。轉(zhuǎn)換規(guī)則如下: 低精度類型高精度類型 見P40 表3.1 高精度類型低精度類型 見P41 表3.2 (gxdzh.c),P43 例 3.5 (L3-5.c) 例 3.6 (L3-6.c) 例 3.7 (L3-7.c ),高精度類型低精度類型 gxdzh.c main() int i=321; char ch; ch=i; printf(i=%d ch=%dn,i,ch); /* int char 截去int的高24位,低8位按有符號處理 */ /* i=00000000 00000000 00000001 01000001 321 */ /* ch=01000001 65 */ 輸出 i

11、=321 ch=65,/* L3-6.c */ main() int a=-1; unsigned int b; b=a; /* int unsigned int 將int的符號位視為數(shù)值 位 */ printf(a=%d b=%u c=%dn,a,b,c); /* int 與unsigned int 處理 需要4個字節(jié) */ /* char 與int 型按有符號二進制 補碼形式存儲*/ /* -1的補碼 11111111 11111111 11111111 11111111 */ /* a中存儲-1的補碼 11111111 11111111 11111111 11111111 */ /* b

12、中存儲 11111111 11111111 11111111 11111111 無符號數(shù)=4294967295 */,/* L3-7.c */ main() int a=12; a+=a-=a*a; printf(%d n,a); /* 賦值運算自右至左 */ /* a-=a*a 相當于 a=(a-a*a) a=(12-12*12) a=-132 */ /* a+=a 相當于 a=(a+a) a=(-132+(-132) a=-264 */,3.3 逗號運算(順序運算) p44,一、逗號運算符,逗號運算符 ,,結(jié)合方向: 自左至右,優(yōu)先級: 最低,二、逗號表達式,一般格式,表達式1 , 表達式

13、2 , , 表達式n,逗號表達式的值,從左到右逐個計算各表達式的值,最后表達式 n 的值作為整個逗號表達式的值,逗號運算符的作用是連接多個數(shù)據(jù)項,而將他們作為一個整 體來處理。例在變量說明與輸出函數(shù)中,逗號作為分隔符,將若干 數(shù)據(jù)項分開,其目的是將他們作為一個整體。逗號也可將若干個 獨立的表達式隔開,同樣將他們作為一個整體處理。,例如 p44 a=3*5,a*4,a+5 中 (a的初始值為5) a=3*5 為第一個表達式 ,表達式的值為15 ,即a的值為15; a*4為第二個表達式, 值為60, a的值不變,仍為15; a+5為第三個表達式, 值為20, a的值不變,仍為15; 最后 a=3*

14、5,a*4,a+5表達式的值為20 ,a的值為15 。 (dhys1.c) 如果將a=3*5,a*4,a+5改寫為 a=(3*5,a*4,a+5) (a的初始值為5) 3*5 為第一個表達式 ,值為15; a*4為第二個表達式,值為20; a+5為第三個表達式,值為10。 最后 a=(3*5,a*4,a+5)表達式的值為10,即a的值為10 。 (dhys2.c) (dhys3.c),三、逗號表達式 的應用 P45 自學,* 例 L3-8-1.c L3-8-2.c,例:3.8 p44 L3-8.c,/* L3-8.c */ main() int c=5; printf(%d,%d,%dn,c+

15、=c+,c+8,+c); /* 運算時自右向左,先計算+c, c的值6 ,然后計算c+8 值14, 再計算c=c+(c+) ,c的值12 。 先執(zhí)行printf,輸出時自左向右 2 14 6 輸出后c自增 c=13 */ printf(“c= %dn”,c); /* 輸出 c=13 */ c=5; printf(%dn,(c+=c+,c+8,+c); /*(c+=c+,c+8,+c) 是逗號表達式。先計算c+=c+ c的值10后自增 c=11 再計算c+8值19,最后計算+c,c的值 12 即是整個逗號表達式值 12 */ c=5; printf(%dn,c+=c+,c+8,+c); /* 運

16、算時同樣自右向左 但只有一個格式轉(zhuǎn)換說明符%d, 因此只輸出c+=c+的值 值12 */ printf(*n); c=5; printf(5. %d,%d,%dn,c+=c+,c+8,c+); /* 運算時自右向左,先計算c+ c值5, 然后計算c+8 值13, 再計算c=c+(c+) c值10 。輸出時自左向右 10 13 5 */ printf(6. %dn,c); /* 輸出后c自增2次 c=12 */ ,3.4 關系運算和邏輯運算,一.關系表達式、邏輯表達式,1.關系表達式,用關系運算符連接兩個算術表達式或賦值表達式,則構(gòu)成關系表達式。,例: 3+6=7 a+b=10,2.邏輯表達式,

17、用邏輯運算符連接兩個關系表達式,構(gòu)成邏輯表達式。,例: x=0 y=z=x+; /* y=z=8 x=9 */ printf(“%d n ,(xy)=(z=x-1); /* (98)=(z=9-1=8) 1=8 值為假 0 輸出0 */ x=y=z; /* 先計算y=z 值為1,然后賦值 x=1 */ printf(“x=%d n ”,x); /* 輸出 x=1 */ printf(%dn,x+=+y-z-); /* x+取值為1 ,+y 值為9 z-取值為8 +y-z-即9-8 值為1, 1=1 值為1 輸出 1 */ ,/* 例3.10 P48 關系運算和邏輯運算 L3-10.c */ #

18、 define EOF 1 main() int a=3,b=4,c=5; printf(%dn,3*(a+b)c /* 表達式 3*(a+b)c (m=ab) /* ab值為0 即m=0 為假,對于邏輯”與”,只要有一個運算量為0,整個邏輯表達式的值即為0,(m=ab) c=a ,2.按位 或 運算 | 運算規(guī)則同 |,3.按位 異或運算 規(guī)則 全真全假值為假,一真一假值為真,4.按位取 反 運算 運算規(guī)則同 !,運行結(jié)果: c=64, d=121 e=57, f=-66,/*按位邏輯運算 p51.c */ main() int a=65, b=120, c,d,e,f; c=a /* 65

19、 =00000000 00000000 00000000 01000001 */ /* 120=00000000 00000000 00000000 01111000 */ /* char c=A,d,e; b=a2; d=c1;e=c2; printf(b=%d c=%d n”,b,c ); printf(d=%d e=%dn,d,e,); ,設a、n均為整型數(shù)據(jù),則 an 表示 將a的各個二進制位順序左移n位,右端空出的位補0,移出左端的位舍棄。,/* 左移位運算 p51-1.c */ main() int a=64, b; /* a=00000000 00000000 00000000

20、01000000*/ char c=A,d,e; /* c=A =65 =01000001 */ b=a2; /* b=00000000 00000000 00000001 00000000 =256*/ d=c1; /* d=10000010 =-126 */ e=c2; /* e=00000100 = 4 */ printf(b=%d c=%d d=%d e=%dn,b,c,d,e); ,對無符號數(shù),左移n位相當于該數(shù)乘2n。 對補碼表示的有符號數(shù)也可能相當于 該數(shù)乘2n ,也可能不是。,運行結(jié)果: b=256 (64*22) c=65 d=-126 e=4,2.右移位運算 (c 采用算術

21、右移),例: main() (p52.c) int a=64, b=-88, c,d; c=a2; d=b3; printf(c=%d n d=%dn,c,d); ,運行結(jié)果: c=16 d=-11,采用算術右移n位,相當于該數(shù)除以2n。 邏輯右移:不管是正數(shù)還是負數(shù)左端空出的位一律補0 。,/* 右移位運算 p52.c */ main() int a=64, b=-88, c,d; c=a2; d=b3; printf(c=%d nd=%dn,c,d); /* a =00000000 00000000 00000000 01000000 =64 */ /* b =11111111 11111

22、111 11111111 10101000 =-88 */ /* c =00000000 00000000 00000000 00010000 =16 */ /* d =11111111 11111111 11111111 11110101 =-11 */,三. 位操作運算符組成的復合賦值運算符, /* a=10=00000000 00001010 */ c1=a,c2=b; /* b=11=00000000 00001011 */ a ,/* 例 3.15 將任意整數(shù)x的后6位全部置0,其余各位不變 如 x=95=00000000 00000000 00000000 01011111 變化后 00000000 00000000 00000000 01000000 main() L3-15.c p53 */ int x; scanf(%d, /* 輸出 x2=64 x=100 */ /* x=95=00000000 00000000 00000000 01011111 */ /* 077=00000000 00000000 00000000 00111111 077=11111111 11111111

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論