第三章數據類型運算符與表達式ppt課件_第1頁
第三章數據類型運算符與表達式ppt課件_第2頁
第三章數據類型運算符與表達式ppt課件_第3頁
第三章數據類型運算符與表達式ppt課件_第4頁
第三章數據類型運算符與表達式ppt課件_第5頁
已閱讀5頁,還剩58頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

1、失之毫厘,謬以千里失之毫厘,謬以千里3 3、1 C1 C言語的數據類型言語的數據類型 3 3、6 6 變量賦初值變量賦初值3 3、2 2 常量和變量常量和變量 3 3、7 7 混合運算混合運算 3 3、3 3 整型數據整型數據 3 3、8 8 算術運算算術運算3 3、4 4 實型數據實型數據 3 3、9 9 賦值運算賦值運算3 3、5 5 字符型數據字符型數據 3 3、10 10 逗號運算逗號運算 3 3、11 11 位運算位運算失之毫厘,謬以千里失之毫厘,謬以千里在程序中對用到的一切數據變量都必需指定其數據類型。在程序中對用到的一切數據變量都必需指定其數據類型。失之毫厘,謬以千里失之毫厘,謬

2、以千里2 2、符號常量、符號常量符號常量:用一個標識符代表一個常符號常量:用一個標識符代表一個常量。量。失之毫厘,謬以千里失之毫厘,謬以千里(1) (1) 普通符號常量用大寫字母取名普通符號常量用大寫字母取名(2) (2) 符號常量的值在其作用域內不能改動符號常量的值在其作用域內不能改動 即程序里不能出現即程序里不能出現 PRICE=40PRICE=40;語句;語句失之毫厘,謬以千里失之毫厘,謬以千里 1標識符: 用來作為變量名、符號常量名、函數名、數組名、文件名等的有效字符序列稱為標識符 規定:1標識符只能由字母,數字和下劃 線組成,且以字母或下劃線開頭 建議不超越 8 個字符。 2大小寫分

3、別表示不同的標識符。2 2關鍵字保管字:關鍵字保管字: 一些在編譯過程中起特殊作用的標識符。一些在編譯過程中起特殊作用的標識符。 如:如:char, int, short, float, doublechar, int, short, float, double if, else, while, if, else, while,等合計等合計3232個個失之毫厘,謬以千里失之毫厘,謬以千里3 3變變 量量 程序運轉過程中其值可以改動的量稱為變量。變程序運轉過程中其值可以改動的量稱為變量。變量應該有名字,并在內存中占有一定的存儲單元。量應該有名字,并在內存中占有一定的存儲單元。 變量名是一個標識符

4、。變量名是一個標識符。合法的變量名:合法的變量名: sum, _above, class1, basicsum, _above, class1, basic不合法的變量名:不合法的變量名: M.D.John, 3D64, ab, #33, $234M.D.John, 3D64, ab, #33, $234留意:留意:1 1變量名普通用小寫字母表示變量名普通用小寫字母表示 2 2起變量名應遵照起變量名應遵照“見名知義見名知義原那么原那么 3 3變量名不能與關鍵字同名。變量名不能與關鍵字同名。失之毫厘,謬以千里失之毫厘,謬以千里4 4 變量的定義及其目的變量的定義及其目的例:例:int a,b,c

5、;int a,b,c; char c1,c2; char c1,c2;其目的為:其目的為:1 1凡未被定義的,不作變量名運用;凡未被定義的,不作變量名運用;2 2指定變量類型后,系統編譯時可分配相應指定變量類型后,系統編譯時可分配相應 的存儲單元;的存儲單元;3 3定義變量類型便于編譯時檢查此變量所定義變量類型便于編譯時檢查此變量所 進展的運算能否合法。進展的運算能否合法。C C中變量應先定義后運用。中變量應先定義后運用。失之毫厘,謬以千里失之毫厘,謬以千里 計算機內部的數據和計算機內部的數據和C C言語的數據都是以二進言語的數據都是以二進制補碼表示的。補碼的最高位為符號位,假設為制補碼表示的

6、。補碼的最高位為符號位,假設為0 0,該數為正數;假設為,該數為正數;假設為1 1,該數為負數。符號位與,該數為負數。符號位與數值位一同參與運算。數值位一同參與運算。 正數的補碼即其本身。負數的補碼可這樣求出:正數的補碼即其本身。負數的補碼可這樣求出:1 1先求該數的絕對值,再求出對應正數的二進先求該數的絕對值,再求出對應正數的二進制編碼;制編碼;2 2對二進制編碼按位取反;對二進制編碼按位取反;3 3對最低位加對最低位加1 1。補充:數的補碼表示補充:數的補碼表示失之毫厘,謬以千里失之毫厘,謬以千里求求-2-2的補碼以兩個字節表示的補碼以兩個字節表示 (1)(1)求求-2-2的絕對值,的絕對

7、值,|-2|=2|-2|=2, 二進制編碼為:二進制編碼為:0000 0000 0000 00100000 0000 0000 00102 2按位取反得:按位取反得:1111 1111 1111 11011111 1111 1111 11013 3最低位加最低位加1 1: 1111 1111 1111 11011111 1111 1111 1101 1 1111 1111 1111 1110 1111 1111 1111 1110失之毫厘,謬以千里失之毫厘,謬以千里3 3、3 3 整型數據整型數據1 1、整型常量、整型常量C C整常數有三種表示方式:整常數有三種表示方式: 十進制:十進制:12

8、3123,456456,0 0八進制:以八進制:以0 0開頭,開頭, 如:如: 0123 0123 等于十進等于十進制數制數8383 011 011 等于十進制數等于十進制數9 9 十六進制:以十六進制:以0 x0 x或或0X0X打頭打頭 如:如:0 x123 0 x123 等于十進制數等于十進制數291291 0 x12 0 x12 等于十進制數等于十進制數1818注注: :負數在計算機中表示方式?負數在計算機中表示方式?失之毫厘,謬以千里失之毫厘,謬以千里2 2、 整型變量整型變量整型變量整型變量根本整型根本整型 intint短整型短整型 shortint shortint 長整型長整型

9、long(int)long(int)無符號型無符號型無符號整型無符號整型unsigned intunsigned int無符號長整型無符號長整型unsigned longunsigned long無符號短整型無符號短整型unsigned shortunsigned short失之毫厘,謬以千里失之毫厘,謬以千里數據類型關鍵字數據類型關鍵字字節個數字節個數取值范圍取值范圍short2-32768+32767unsigned short20+65535int2-32768+32767unsigned20+65535long4-21474836482147483647unsigned long404

10、294967295失之毫厘,謬以千里失之毫厘,謬以千里0 0 0 0 0 0 00 0 0 0 1 1 0 10int 型0 0 0 0 1 1 0 10 0 0 0 0 0 0 0unsigned int 整數整數1313在存儲單元中的存儲情況在存儲單元中的存儲情況失之毫厘,謬以千里失之毫厘,謬以千里3 3、 整型變量的定義及運用整型變量的定義及運用程序中用到的變量都必需先定義,例如:程序中用到的變量都必需先定義,例如:運轉結果: a+u=22 , b+u= - 14失之毫厘,謬以千里失之毫厘,謬以千里4 4、 整型數據的溢出整型數據的溢出 一個一個intint型變量的最大允許值是型變量的最

11、大允許值是32767,32767,假設再加假設再加1,1,其結果會是怎樣一種情況其結果會是怎樣一種情況? ? 它就好似汽車的里程表一樣它就好似汽車的里程表一樣, ,到達最大值后到達最大值后, ,又又從最小的開場計數從最小的開場計數. . 失之毫厘,謬以千里失之毫厘,謬以千里5 5、 整型常量的類型整型常量的類型1. 1. 值在值在32768327683276732767的整常數,以為它是的整常數,以為它是intint型,型, 可賦給可賦給 int int 型和型和 long int long int 型變量型變量; ;2. 2. 值超越上述范圍,而在值超越上述范圍,而在2 2 2 21 1的整

12、常數,的整常數, 以為它是以為它是 long int long int 型型, ,可賦給可賦給 long int long int 型變量型變量; ;3. 3. 只需非負的整常數可賦給只需非負的整常數可賦給 unsignedunsigned型變量型變量, , 但但 值不能超出該值不能超出該 unsigned unsigned 型變量的取值范圍型變量的取值范圍; ;4. 4. 整常量后加一個整常量后加一個l l 或或L L,那么以為其為,那么以為其為 long int long int 型型 常量常量, , 如:如:123L123L,0L0L,432L432L 此常用于函數調用中此常用于函數調用

13、中, ,使形參類型匹配于實參類型。使形參類型匹配于實參類型。3131失之毫厘,謬以千里失之毫厘,謬以千里3 3、4 4實型數據實型數據1 1、實型常量、實型常量 1)十進制數方式:由數字和小數點組成十進制數方式:由數字和小數點組成 如如: 0.0 , 0.123, -34.6, .678 , 90. 留意:小數點必需有,且其前后數字不能同時缺省。留意:小數點必需有,且其前后數字不能同時缺省。 2)指數方式科學計數法指數方式科學計數法):由尾數,指數和由尾數,指數和 字母字母e或或E組成組成 如:如:123E3 代表代表 12310 留意:留意:E前必需有數字,前必需有數字,E后必需為整數后必需

14、為整數 E5 3.4E5.6 不合法不合法3失之毫厘,謬以千里失之毫厘,謬以千里 3)規范化的指數規范化的指數(輸出輸出)方式方式:即在字母即在字母e或或E之前的小數之前的小數部分中部分中,小數點左邊應有一位且只能有一位非零的數字小數點左邊應有一位且只能有一位非零的數字。 如:如:2.3478e2、3.099E5 等等等等. 4)實型數據在內存的存放方式實型數據在內存的存放方式:實型數據是按指數方式實型數據是按指數方式存儲的存儲的,系統把一個實型數據分成小數部分系統把一個實型數據分成小數部分(.xxxxx)和指和指數部分數部分(采用規范化的指數方式采用規范化的指數方式),分別存放分別存放. 如

15、如:3.14159 小數部分占的位數越多小數部分占的位數越多, ,精度越高精度越高; ;指數部分占指數部分占的位數越多的位數越多, ,可表示數值范圍越大可表示數值范圍越大. .失之毫厘,謬以千里失之毫厘,謬以千里2 2、實型變量、實型變量單精度型單精度型floatfloat 3232位位 7 7位有效數字位有效數字 10 10 10 10 雙精度型雙精度型doubledouble 6464位位 151516 16 位有效數字位有效數字 10 10 10 10 3838308308定義實型變量:定義實型變量: float x , y ;float x , y ; double z , a, b

16、; double z , a, b ;失之毫厘,謬以千里失之毫厘,謬以千里留意實型數據的舍入誤差;該當防止將一個很大的數和一個很小的數直接相加減;同理1.0/3*3!=1失之毫厘,謬以千里失之毫厘,謬以千里3.5 3.5 字符型數據字符型數據失之毫厘,謬以千里失之毫厘,謬以千里失之毫厘,謬以千里失之毫厘,謬以千里2 2、 字符變量字符變量 用來存放一個字用來存放一個字符常量。符常量。 定義方式:定義方式: char c1,c2 char c1,c2 ; ; 賦值:賦值:c1 = O ; c2 = K; 那么:那么:printf(printf(%c %c n %c %c n ,c1 , c2);

17、,c1 , c2);輸出:輸出:O KO K失之毫厘,謬以千里失之毫厘,謬以千里3 3、 字符數據在內存中的存儲方式及其運用方法字符數據在內存中的存儲方式及其運用方法 1 1字符數據在內存中存放的是其字符數據在內存中存放的是其ASCIIASCII值。值。 例:例: char c1, c2;char c1, c2; c1 = c1 = a a ; c2 = ; c2 = b b ; ; 那么:那么: c1c20 1 1 0 0 0 0 10 1 1 0 0 0 1 0失之毫厘,謬以千里失之毫厘,謬以千里2 2 C C中,整型數據和字符型數據之間可通用中,整型數據和字符型數據之間可通用 1 1程序

18、中,字符數據既可按字符方式輸出,程序中,字符數據既可按字符方式輸出, 也可以整數方式輸出。也可以整數方式輸出。 由輸出格式字符串由輸出格式字符串 %c %c 和和 %d %d 決議。決議。 2 2字符數據可進展算術運算,字符變量字符數據可進展算術運算,字符變量 既可賦值以字符常量,也可賦以相應的既可賦值以字符常量,也可賦以相應的 ASCIIASCII值。值。 C C的整型數據與字符數據間可相互賦值。的整型數據與字符數據間可相互賦值。失之毫厘,謬以千里失之毫厘,謬以千里運轉結果:運轉結果: a ba b A B A B失之毫厘,謬以千里失之毫厘,謬以千里4 4、 字符串常量字符串常量一對雙引號括

19、起來的字符序列。例:一對雙引號括起來的字符序列。例:a a, , How do you do.How do you do., ChinaChina , , abcnabcn, , $123.45$123.45C C規定:規定:在內存中,系統自動在每個字符串的在內存中,系統自動在每個字符串的結尾加上一個字符串終了標志結尾加上一個字符串終了標志00,以便,以便系統據此判別字符串終了標志。系統據此判別字符串終了標志。所以,所以,“a a 在內存中占兩個字節。在內存中占兩個字節。a0失之毫厘,謬以千里失之毫厘,謬以千里char c ;char c ; c = c = a a ; ; c = c = a

20、 a ; ;C C 中無專門的字符串變量,如需求,可用中無專門的字符串變量,如需求,可用字符數組來存放。字符數組來存放。留意:字符常量和字符串常量不可混淆。留意:字符常量和字符串常量不可混淆。失之毫厘,謬以千里失之毫厘,謬以千里3.6 3.6 變量賦初值變量賦初值 此些變量的初始化不是在編譯階段完成此些變量的初始化不是在編譯階段完成, ,而是在程序執行本函數時賦予初值的而是在程序執行本函數時賦予初值的, ,相當于相當于有一個賦值語句。有一個賦值語句。失之毫厘,謬以千里失之毫厘,謬以千里3.7 3.7 數值型數據間的混合運算數值型數據間的混合運算C C中,整型,字符型,實型包括單精度,中,整型,

21、字符型,實型包括單精度,雙精度數據可出如今一個表達式中進展雙精度數據可出如今一個表達式中進展混合運算。混合運算。類型自動轉換規那么類型自動轉換規那么高高低低double floatlongunsignedint char, short失之毫厘,謬以千里失之毫厘,謬以千里例:例:int i ; floatint i ; float f ; f ; double d ; long e ; double d ; long e ;那么:那么:10 10 a a+ i + i * * f - d / e f - d / e 合法合法轉換次序:轉換次序: 1 1計算計算 1010a a, , 結果為整數結

22、果為整數107107 2 2計算計算 i i* *f , f , 結果為結果為doubledouble型型 3 3整數整數107107與與i i* *f f的積相加,結果為的積相加,結果為doubledouble型型 4 4計算計算 d/e d/e , 結果為結果為doubledouble型型 5 5將將1010a a+i +i * * f f 的結果與的結果與 d/e d/e 的商的商 相減,結果為相減,結果為doubledouble型。型。失之毫厘,謬以千里失之毫厘,謬以千里3 3、8 8 算術運算符和算術表達式算術運算符和算術表達式1 1、運算符的種類、優先級和結合性、運算符的種類、優先

23、級和結合性 言語中運算符和表達式數量之多,言語中運算符和表達式數量之多, 在高級在高級言語中是少見的。正是豐富的運算符和表達式使言語中是少見的。正是豐富的運算符和表達式使言語功能非常完善。言語功能非常完善。 這也是言語的主要特點這也是言語的主要特點之一。之一。 言語的運算符不僅具有不同的優先級,言語的運算符不僅具有不同的優先級, 而而且還有一個特點,就是它的結合性。在表達式中,且還有一個特點,就是它的結合性。在表達式中,各運算量參與運算的先后順序不僅要遵守運算符各運算量參與運算的先后順序不僅要遵守運算符優先級別的規定,還要受運算符結合性的制約,優先級別的規定,還要受運算符結合性的制約, 以以便

24、確定是自左向右進展運算還是自右向左進展運算。便確定是自左向右進展運算還是自右向左進展運算。這種結合性是其它高級言語的運算符所沒有的,因此這種結合性是其它高級言語的運算符所沒有的,因此也添加了言語的復雜性。也添加了言語的復雜性。失之毫厘,謬以千里失之毫厘,謬以千里失之毫厘,謬以千里失之毫厘,謬以千里2. 2. 算術運算符和算術表達式算術運算符和算術表達式1 1 根本算術運算符根本算術運算符 * * / % / %模除,或稱求余模除,或稱求余 例:例:7 % 3 7 % 3 值為值為 1 1 5/3 = 1, -5/3 = -1 5/3 = 1, -5/3 = -1 假設參與運算的兩個數中有一個為

25、實數,那么假設參與運算的兩個數中有一個為實數,那么結果為結果為double型。型。求余運算求余運算% %要求參與運算的量均為整型。要求參與運算的量均為整型。其結果等于兩數相除后的余數。其結果等于兩數相除后的余數。 失之毫厘,謬以千里失之毫厘,謬以千里main( )main( ) printf(nn%d,%dn,20/7,-20/7); printf(nn%d,%dn,20/7,-20/7); printf(%f,%fn,20.0/7,-20.0/7); printf(%f,%fn,20.0/7,-20.0/7); 參與運算量均為整型時,參與運算量均為整型時, 結果也為整型,舍去小數。結果也為整

26、型,舍去小數。 假設運算量中有一個是實型,那么結果為雙精度實型。假設運算量中有一個是實型,那么結果為雙精度實型。 本例中,本例中,20/720/7,-20/7-20/7的結果均為整型,小數全部舍的結果均為整型,小數全部舍去。而去。而 20.0/720.0/7和和-20.0/7-20.0/7由于有實數參與運算,因此由于有實數參與運算,因此結果也為實型。結果也為實型。失之毫厘,謬以千里失之毫厘,謬以千里2 2 算術表達式算術表達式 表達式是由常量、變量、函數和運算符組合起來表達式是由常量、變量、函數和運算符組合起來的式子。的式子。 一個表達式有一個值及其類型,一個表達式有一個值及其類型, 它們等于

27、它們等于計算表達式所得結果的值和類型。表達式求值按運算計算表達式所得結果的值和類型。表達式求值按運算符的優先級和結合性規定的順序進展。符的優先級和結合性規定的順序進展。 單個的常量、單個的常量、變量、函數可以看作是表達式的特例。變量、函數可以看作是表達式的特例。 算術表達式是由算術運算符和括號銜接起來的式算術表達式是由算術運算符和括號銜接起來的式子,子, 以下是算術表達式的例子:以下是算術表達式的例子: a+b (aa+b (a* *2)2)c (x+r)c (x+r)* *8-(a+b)8-(a+b)7 7 +i sin(x)+sin(y) (+i)-(j+)+(k-) +i sin(x)+

28、sin(y) (+i)-(j+)+(k-) 失之毫厘,謬以千里失之毫厘,謬以千里留意:留意:C C言語算術表達式的書寫方式類似于數學中言語算術表達式的書寫方式類似于數學中的代數表達式,但有區別:的代數表達式,但有區別:(1) a (1) a * * b b 不能寫為不能寫為 a ab b、ab ab 、a.ba.b(2) c / d (2) c / d 不能寫為不能寫為 c cd d 、cd(3) e-(f+(g-h)/(i-j)+k (3) e-(f+(g-h)/(i-j)+k 不能寫為不能寫為 e-f+(g-h)/(i-j)+k e-f+(g-h)/(i-j)+k (4) 3.14(4)

29、3.14* *r r* *r r 不能寫為不能寫為* *r r* * *2 2 或或 3.143.14* *r2r2(5) sin( x ) (5) sin( x ) 不能寫為不能寫為 sinxsinx(6) log( x ) (6) log( x ) 不能寫為不能寫為 lnxlnx log10( x ) log10( x ) 不能寫為不能寫為 logxlogx10失之毫厘,謬以千里失之毫厘,謬以千里3 3、 算術運算符的優先級和結合性算術運算符的優先級和結合性1 1 優先級:指表達式運算時應按運算符的優先級:指表達式運算時應按運算符的優先級別高低次序進展,例:優先級別高低次序進展,例: 高高

30、 * * / % / % + - + - 低低 如:如:a-ba-b* *c c 相當于相當于 a-(ba-(b* *c )c )失之毫厘,謬以千里失之毫厘,謬以千里2 2 結合性:先按運算符的優先級別高低依次進展結合性:先按運算符的優先級別高低依次進展. .假設在一個運算對象兩側的運算符的優先級一樣,假設在一個運算對象兩側的運算符的優先級一樣,那么按規定的那么按規定的“結合方向結合方向處置。處置。 算術運算符的結合方向自左向右算術運算符的結合方向自左向右: :運算對象先運算對象先與左面的運算符結合與左面的運算符結合. .稱為稱為 左結合性。左結合性。 例:例: a-b+c a-b+c 相當于

31、相當于 (a-b)+c(a-b)+c失之毫厘,謬以千里失之毫厘,謬以千里4 4、 強迫類型轉換運算強迫類型轉換運算 作用作用 :將一個表達式轉換成所需類型:將一個表達式轉換成所需類型 方式方式 :類型名表達式:類型名表達式 例:例:(double)a (int) (x+y) (float) (5%3)闡明:強迫類型轉換時,得到一個所需類型的闡明:強迫類型轉換時,得到一個所需類型的中間變量,而原來變量的類型未發生變化。中間變量,而原來變量的類型未發生變化。舉例:舉例:float x=2.5; int i; i=(int)x;失之毫厘,謬以千里失之毫厘,謬以千里5 5、自增,自減運算符、自增,自減

32、運算符 自增運算符記為自增運算符記為“+,其功能是使變量的值自增,其功能是使變量的值自增1 1。 自減運算符記為自減運算符記為“-,其功能是使變量值自減,其功能是使變量值自減1 1。 可有以下幾種方式:可有以下幾種方式:+i i+i i自增自增1 1后后i i再參與表達式整體的其它運算。再參與表達式整體的其它運算。-i i-i i自減自減1 1后后i i再參與表達式整體的其它運算。再參與表達式整體的其它運算。i+ ii+ i參與表達式整體的運算后,參與表達式整體的運算后,i i的值再自增的值再自增1 1。i- ii- i參與表達式整體的運算后,參與表達式整體的運算后,i i的值再自減的值再自減

33、1 1。 在了解和運用上容易出錯的是在了解和運用上容易出錯的是i+i+和和i-i-。 特別是當特別是當它們出在較復雜的表達式或語句中時,經常難于弄清,因它們出在較復雜的表達式或語句中時,經常難于弄清,因此應仔細分析。此應仔細分析。失之毫厘,謬以千里失之毫厘,謬以千里留意:留意: 1 1自增、自減運算符只能用于變量,而不能用于自增、自減運算符只能用于變量,而不能用于常量或表達式。如常量或表達式。如 5+ 5+ a+ba+b+ + 都是不合法的。都是不合法的。 2 2+和和-的結合方向是的結合方向是“自右向左自右向左。如。如 -i+-i+ 應了解為應了解為- -i+i+ 而不是而不是 -i-i+

34、3 3自增、自減運算符常用于循環語句中自增、自減運算符常用于循環語句中, ,使循環變使循環變量自動加量自動加1,1,也用于指針變量也用于指針變量, ,使指針指向下一個地址使指針指向下一個地址. .失之毫厘,謬以千里失之毫厘,謬以千里 main( ) main( ) int i=8; int i=8; printf(%dn,+i); 9 printf(%dn,+i); 9 printf(%dn,-i); 8 printf(%dn,-i); 8 printf(%dn,i+); 8 printf(%dn,i+); 8 printf(%dn,i-); 9 printf(%dn,i-); 9 print

35、f(%dn,-i+); -8 printf(%dn,-i+); -8 printf(%dn,-i-); -9 printf(%dn,-i-); -9 i i的初值為的初值為8 8,第,第2 2行行i i加加1 1后輸出為后輸出為9 9;第;第3 3行減行減1 1后輸出后輸出為為8 8;第;第4 4行輸出行輸出i i為為8 8之后再加之后再加1(1(為為9)9);第;第5 5行輸出行輸出i i為為9 9之后再減之后再減1(1(為為8) 8) ;第;第6 6行輸出行輸出-8-8之后再加之后再加1(1(為為9)9),第,第7 7行輸出行輸出-9-9之后再減之后再減1(1(為為8)8)。失之毫厘,謬以

36、千里失之毫厘,謬以千里 main() main() int i=5,j=5,p,q; int i=5,j=5,p,q; p=(i+)+(i+)+(i+); p=(i+)+(i+)+(i+); q=(+j)+(+j)+(+j); q=(+j)+(+j)+(+j); printf(%d,%d,%d,%d,p,q,i,j); printf(%d,%d,%d,%d,p,q,i,j); i-5,j-5 i-5,jp,i+1-i,i+1-i,i+1-i i+i+i-p,i+1-i,i+1-i,i+1-i j+1-j,j+1-j,j+1-j,j+j+j-q j+1-j,j+1-j,j+1-j,j+j+j-q

37、 這個程序中,對這個程序中,對P=(i+)+(i+)+(i+)P=(i+)+(i+)+(i+)應了解為三應了解為三個個i i相加,故相加,故P P值為值為1515。然后。然后i i再自增再自增1 1三次相當于加三次相當于加3 3故故i i的最后值為的最后值為8 8。 而對于而對于q q 的值那么不然,的值那么不然,q=(+j)+(+j)+(+j)q=(+j)+(+j)+(+j)應理應理解為解為q q先自增先自增1 1,再參與運算,由于,再參與運算,由于q q自增自增1 1三次后值為三次后值為8 8,三個三個8 8相加的和為相加的和為2424,j j的最后值仍為的最后值仍為8 8。失之毫厘,謬以

38、千里失之毫厘,謬以千里3 3、9 9 賦值運算符和賦值表達式賦值運算符和賦值表達式 1 1、簡單賦值運算符和表達式、簡單賦值運算符和表達式 簡單賦值運算符記為簡單賦值運算符記為“= =。由。由“= = 銜接銜接 的式子稱為賦值表達式。其普通方式為:的式子稱為賦值表達式。其普通方式為: 變量變量= =表達式表達式 例如:例如: x=a+bx=a+b w=sin(a)+sin(b) w=sin(a)+sin(b) y=i+ + -j y=i+ + -j 賦值表達式的功能是計算表達式的值再賦予左邊賦值表達式的功能是計算表達式的值再賦予左邊 的變量。賦值運算符具有右結合性。因此的變量。賦值運算符具有右

39、結合性。因此 a=b=c=5 a=b=c=5 可了解為可了解為 a=(b=(c=5)a=(b=(c=5)失之毫厘,謬以千里失之毫厘,謬以千里關于簡單賦值運算符及賦值表達式的闡明:關于簡單賦值運算符及賦值表達式的闡明: 1 1在其它高級言語中,賦值構成了一個語句,稱為在其它高級言語中,賦值構成了一個語句,稱為賦值語句。賦值語句。 而在而在C C中,把中,把“= =定義為運算符,從而組定義為運算符,從而組成賦值表達式。成賦值表達式。 凡是表達式可以出現的地方均可出現凡是表達式可以出現的地方均可出現賦值表達式。例如,式子賦值表達式。例如,式子x=(a=5)+(b=8)x=(a=5)+(b=8)是合法

40、的。它是合法的。它的意義是把的意義是把5 5賦予賦予a a,8 8賦予賦予b b,再把表達式,再把表達式a=5,b=8a=5,b=8的值的值相加,和賦予相加,和賦予x x,故,故x x應等于應等于1313。 2 2在言語中也可以組成賦值語句,按照言語規在言語中也可以組成賦值語句,按照言語規定,定, 任何表達式在其未尾加上分號就構成為語句。因任何表達式在其未尾加上分號就構成為語句。因此,如此,如x=8;a=b=c=5x=8;a=b=c=5;都是賦值語句。;都是賦值語句。失之毫厘,謬以千里失之毫厘,謬以千里賦值時的類型轉換賦值時的類型轉換 假設賦值運算符兩邊的數據類型不一樣,假設賦值運算符兩邊的數

41、據類型不一樣, 系統將自系統將自動進展類型轉換,即把賦值號右邊的類型換成左邊的類動進展類型轉換,即把賦值號右邊的類型換成左邊的類型。詳細規定如下:型。詳細規定如下: 1.1.實型賦予整型,舍去小數部分。前面的例子曾經實型賦予整型,舍去小數部分。前面的例子曾經闡明了這種情況。闡明了這種情況。 2.2.整型賦予實型,數值不變,但將以浮點方式存放,整型賦予實型,數值不變,但將以浮點方式存放, 即添加小數部分即添加小數部分( (小數部分的值為小數部分的值為0)0)。 3.3.字符型賦予整型,由于字符型為一個字節,字符型賦予整型,由于字符型為一個字節, 而整而整型為二個字節,故將字符的型為二個字節,故將

42、字符的ASCIIASCII碼值放到整型量的低八碼值放到整型量的低八位中,高八位為位中,高八位為0 0。 4.4.整型賦予字符型,只把低八位賦予字符量。整型賦予字符型,只把低八位賦予字符量。失之毫厘,謬以千里失之毫厘,謬以千里 main() int a,b=322; float x,y=8.88; char c1=k,c2; a=y; x=b; a=c1; c2=b; printf(%d,%f,%d,%c,a,x,a,c2); 本例闡明了上述賦值運算中類型轉換的規那么:本例闡明了上述賦值運算中類型轉換的規那么: a為整型,賦以實型量為整型,賦以實型量y值值8.88后只取整數后只取整數8。 x為實

43、型,賦以整型量為實型,賦以整型量b值值322, 后添加了小數部分。后添加了小數部分。 字符型量字符型量c1賦以賦以a變為整型,變為整型, 整型量整型量b賦予賦予c2 后取其低八位成為字符型后取其低八位成為字符型(b的低八位的低八位 為為01000010,即十進制,即十進制66,按,按ASCII碼對應于字符碼對應于字符B)。 失之毫厘,謬以千里失之毫厘,謬以千里2.2.復合賦值符及表達式復合賦值符及表達式 在賦值符在賦值符“= =之前加上其它二目運算符可構成復之前加上其它二目運算符可構成復合賦值符。如合賦值符。如+=,-=,+=,-=,* *=,=,=,%=,=,&=,=,|=,%=,=

44、,&=,=,|=。 構成復合賦值表達式的普通方式為:構成復合賦值表達式的普通方式為: 變量變量 雙目運算符雙目運算符= =表達式表達式 它等效于它等效于 變量變量= =變量變量 運算符運算符 表達式表達式 例如:例如: a+=5 a+=5 等價于等價于a=a+5a=a+5 x x* *=y+7 =y+7 等價于等價于x=xx=x* *(y+7)(y+7) r%=p r%=p 等價于等價于r=r%pr=r%p 復合賦值符這種寫法,對初學者能夠不習慣,復合賦值符這種寫法,對初學者能夠不習慣, 但十但十分有利于編譯處置,能提高編譯效率并產生質量較高的分有利于編譯處置,能提高編譯效率并產生質量

45、較高的目的代碼。目的代碼。失之毫厘,謬以千里失之毫厘,謬以千里3 3、10 10 逗號運算符和逗號表達式逗號運算符和逗號表達式 在言語中逗號在言語中逗號“,也是一種運也是一種運算符,稱為逗號算符,稱為逗號運算符。運算符。 其功能是把兩個表達式銜接起來組其功能是把兩個表達式銜接起來組成一個表達成一個表達式,稱為逗號表達式。其普通方式為:式,稱為逗號表達式。其普通方式為: 表達式表達式1 1,表達式,表達式2 2 其求值過程是分別求兩個表達式的值,其求值過程是分別求兩個表達式的值,并以表達式并以表達式2 2的值作為整個逗號表達式的值。的值作為整個逗號表達式的值。失之毫厘,謬以千里失之毫厘,謬以千里

46、 main() main() int a=2,b=4,c=6,x,y; int a=2,b=4,c=6,x,y; y=(x=a+b),(b+c); y=(x=a+b),(b+c); z=(x=a+b),(b+c); z=(x=a+b),(b+c); printf(z=%d,y=%d,x=%d,z,y,x); printf(z=%d,y=%d,x=%d,z,y,x); a-2,b-4,c-6,x-0,y-0 a-2,b-4,c-6,x-0,y-0 x-a+b,y-x z- b+c x-a+b,y-x z- b+c本例中,本例中,z z等于整個逗號表達式的值,也就是表達式等于整個逗號表達式的值,也

47、就是表達式2 2的值,的值,x x是第一個表達式的值。是第一個表達式的值。失之毫厘,謬以千里失之毫厘,謬以千里 2. 2.程序中運用逗號表達式,通常是要分別求逗號表達式內各表達程序中運用逗號表達式,通常是要分別求逗號表達式內各表達 式的值,并不一定要求整個逗號表達式的值。式的值,并不一定要求整個逗號表達式的值。 3.3.并不是在一切出現逗號的地方都組成逗號表達式,如在變量說并不是在一切出現逗號的地方都組成逗號表達式,如在變量說 明中,函數參數表中逗號只是用作各變量之間的間隔符。明中,函數參數表中逗號只是用作各變量之間的間隔符。對于逗號表達式還要闡明幾點:對于逗號表達式還要闡明幾點: 1.1.逗

48、號表達式普通方式中的表達式逗號表達式普通方式中的表達式1 1和表達式和表達式2 2 也可以也可以又是逗號表達式。例如:又是逗號表達式。例如: 表達式表達式1 1,( (表達式表達式2 2,表達式,表達式3) 3) 構成了嵌套情形。因此可以把逗號表達式擴展為以構成了嵌套情形。因此可以把逗號表達式擴展為以下方式:下方式: 表達式表達式1 1,表達式,表達式2 2,表達式表達式n n 整個逗號表達式的值等于表達式整個逗號表達式的值等于表達式n n的值。的值。失之毫厘,謬以千里失之毫厘,謬以千里3 3、11 11 位運算位運算 C C言語是為描畫系統而設計的,因此它具有匯編言語所能完言語是為描畫系統而

49、設計的,因此它具有匯編言語所能完成的一些功能。在系統軟件中,常要處置二進制位的問題。例成的一些功能。在系統軟件中,常要處置二進制位的問題。例如如: :將一個存儲單元中的各二進位左移或右移一位,兩個數按位將一個存儲單元中的各二進位左移或右移一位,兩個數按位相加等等。相加等等。C C言語提供了位運算功能,與其他言語相比更具有其獨言語提供了位運算功能,與其他言語相比更具有其獨特的優越性。特的優越性。 所謂位運算是指進展二進制位的運算。所謂位運算是指進展二進制位的運算。失之毫厘,謬以千里失之毫厘,謬以千里1.1.位運算和位運算符位運算和位運算符C C言語提供了以下位運算符:言語提供了以下位運算符: 運

50、算符運算符 含含 義義 解解 釋釋 & & 按位與按位與 假設兩個二進位都為假設兩個二進位都為1 1,結果為,結果為1 1,否那么,否那么為為0 0 | | 按位或按位或 假設兩個二進位都為假設兩個二進位都為0 0,結果為,結果為0 0,否那么,否那么為為1 1 按位異或按位異或 假設兩個二進位同號,那么結果為假設兩個二進位同號,那么結果為0 0,否,否那么為那么為1 1 單目取反單目取反 對一個二進制數按位取反:對一個二進制數按位取反:1 1變變0 0,0 0變變1 1 右右 移移 將一個二進制數全部右移,對于無符號數,將一個二進制數全部右移,對于無符號數, 左端補左端補0

51、0;對于有符號數:正數補;對于有符號數:正數補0 0,負數補,負數補 1 1算術右移。算術右移。 右移一位相當于除以右移一位相當于除以2 2。失之毫厘,謬以千里失之毫厘,謬以千里闡明:闡明: 1 1位運算中除了位運算中除了 外,均為二目運算符,即要求兩側各有外,均為二目運算符,即要求兩側各有一個運算量。一個運算量。 2 2運算量只能是整型或字符型數據,不能為實型數據。運算量只能是整型或字符型數據,不能為實型數據。1 1、& &運算運算 例如:例如:3&5 3&5 00000011 00000011 & 00000101 & 00000101 00

52、000001 00000001特殊用途:特殊用途: 1 1清零:原來數中為清零:原來數中為1 1的位,新數中相應位為的位,新數中相應位為0 0。 2 2保管某些指定位:新保管某些指定位:新數中對應位為數中對應位為1 1。 3 3保管某一位:新數中保管某一位:新數中該位取該位取1 1。失之毫厘,謬以千里失之毫厘,謬以千里2 2、| |運算運算 例如:例如:3&5 3&5 00000011 00000011 | 00000101 | 00000101 00000111 000001113 3、 運算運算 例如:例如:3&5 3&5 00000011 00000011

53、 00000101 00000101 00000110 000001103 3、 運算特殊用途運算特殊用途 1 1使特定位翻轉:新數使特定位翻轉:新數翻轉位翻轉位 置置1 1。 2 2保管原值:與保管原值:與0 0相相 3 3交換兩個數,不用暫交換兩個數,不用暫時變量。時變量。失之毫厘,謬以千里失之毫厘,謬以千里4 4、 運算運算 例如:例如:5 5 00000101 00000101 11111010 11111010 運算符的優先級比算術運算符、關系運算符、邏輯運算符和運算符的優先級比算術運算符、關系運算符、邏輯運算符和其他位運算符都高,例如:其他位運算符都高,例如:a&b,a&a

54、mp;b,先進展先進展aa運算,然后進展運算,然后進展& &運運算。算。失之毫厘,謬以千里失之毫厘,謬以千里5 5、左移運算符、左移運算符 例如:例如:a=15;a=a2; a=15;a=a00111100 00001111=00111100 左移左移1 1位相當于該數乘以位相當于該數乘以2 2。但此結論只適宜于該數左移時。但此結論只適宜于該數左移時舍棄位中不包含舍棄位中不包含1 1的情況。的情況。6 6、右移運算符、右移運算符 例如:例如:a=15;a=a2; a=15;a=a2; 00001111=00000011 00001111=00000011 右移右移1 1位相當于該數除以位相當于該數除以2 2。但是需留意到符

溫馨提示

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

評論

0/150

提交評論