C語言資料第三章新.ppt_第1頁
C語言資料第三章新.ppt_第2頁
C語言資料第三章新.ppt_第3頁
C語言資料第三章新.ppt_第4頁
C語言資料第三章新.ppt_第5頁
已閱讀5頁,還剩78頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、1,第三章 數(shù)據(jù)類型、運算符和表達式,主要內容: C 語言的數(shù)據(jù)類型 常量與變量 整型數(shù)據(jù) 浮點型數(shù)據(jù) 字符型數(shù)據(jù) 變量賦初值 各類數(shù)值型數(shù)據(jù)間的混合運算 算術運算符和算術表達式 賦值運算符和賦值表達式 逗號運算符和逗號表達式,2,3.1 C語言的數(shù)據(jù)類型,計算:3*2 數(shù)值型數(shù)據(jù) 在屏幕上顯示“我是河科人 字符串常量 到203房間找某人 指針型數(shù)據(jù) 學號為101-103的全體學生 數(shù)組型數(shù)據(jù),算法處理的對象是數(shù)據(jù),數(shù)據(jù)是數(shù)據(jù)的組織形式即數(shù)據(jù)結構。不同的數(shù)據(jù)之間往往存在某些聯(lián)系。不同的計算機語言使用的數(shù)據(jù)結構是不相同的。所以,處理同一類問題,如果數(shù)據(jù)結構不同,算法也會不同。因此, 在程序設計時

2、,應綜合考慮算法和數(shù)據(jù)結構。選擇最佳的數(shù)據(jù)結構和算法。,回顧第二章:,問題的提出:,3,3.1 C的數(shù)據(jù)類型,數(shù)據(jù)類型,所有的數(shù)據(jù),在進行處理時都需要先存放進計算機的內存中,所以了解不同的數(shù)據(jù)在計算機中存儲的形式是很重要的。,4,3.2 常量與變量,在程序設計中,我們不僅使用到常量,如:123,-90,0.125等,而且我們更多地還要使用變量,因為它們的值在程序的運行中是可以改變的。 本節(jié)內容需要了解常量及變量的概念、變量的命名規(guī)則。,5,語言字符集 1、英文字母:大小寫各26個,共計52個; 2、阿拉伯數(shù):09共10個數(shù)字; 3、下劃線:_; 4、特殊符號:通常指由12個符號組成的運算符。

3、算術運算符: + - * / % + - 關系運算符: = 條件運算符: ?: 和 = (即賦值運算符) 其他分隔符: ( ) . , ;,一、C語言字符集、標識符和關鍵字,6,C 語言的標識符,標識符: 用來標識變量名、符號常量名、函數(shù)名、數(shù)組名、類型名、文件名的有效字符序列。標識符就是一個名字。 合法標識符:由字母、數(shù)字、下劃線組成且第一個字符必須為字母或下劃線;不允許超過32個字符。但為了程序的可移植性,建議不要超過8個字符。 例:student_name與student_code是一樣的標識符,超過8個的舍去。 用戶標識符:去掉32個關鍵字后的合法標識符.例如:int、float、if

4、等,是C語言的關鍵字,不能作為用戶標識符。,注意: * C語言標識符中大、小字母不通用。例:sum和SUM是兩個 不同的標識符。 * C語言規(guī)定,保留關鍵字不能作為用戶標識符。 * C語言的保留關鍵字共有32個見附錄B。,7,C 語言的標識符,.不能作標識符,-不能作標識符,不能以數(shù)字開頭,關鍵字不能作用戶標識符,關鍵字不能作用戶標識符,#不能作標識符,a1,abc.c,a_b,a-b,abc123,3a,int,Int,Len#1,else,合法標識符:_22A,lea_1,avg3,day,ABCde43xyw8 不合法標識符:M.J.YORK,$_238,#xy,a*b,8Tea,判斷下

5、列用戶標識符的合法性:,8,就是具有特定含義的標識符,用戶不能用來作為自定義標識符。由ANSI標準推薦的關鍵字有32個,常用的有: 與數(shù)據(jù)類型有關的: char int float double signed unsigned short long void struct union type def enum sizeof 與存儲類別有關的: auto extern register static 與程序控制結構有關的: do while for if else switch case default go to continue break return,關鍵字,9,二、常量與符號常量,常

6、量: 在程序運行過程中,其值不變的量稱為常量,如:85,-67,23.7,A,9,“A”等。一般從字面上即可判別,這種常量叫直接常量(字面常量) 。 常量的分類: (1)整型常量 (2)實型常量 (3)字符常量 (4)字符串常量 (5)符號常量。常量的類型,可通過書寫形式來判別。 符號常量: 用一個標識符來表示一個常量就叫作符號常量,符號常量的常用預處理命令define來實現(xiàn),其定義形式為: #define 標識符 常量 例如: #define PI 3.1415,含義為:定義PI為符號常量,其值為3.1415,說明:一般習慣上用大寫字母表示符號常量,用小寫字母表示變量,以示區(qū)別。但僅僅是習慣

7、而不是規(guī)定。,10,程序L3-1.C 符號常量的使用,#define PRICE 30 #include main() int num,total; num=10; total=num* PRICE; printf(“total=%dn”,total); ,好處: 1.含義清楚;定義符號常量時,要做到”見名知意”; 2.在需要改變一個常量時,能做到”一改全改”。,說明: 1.程序中的PRICE都代表30 2. 符號常量的值在其作用域內不能改變,也不能再賦值 3. 如果再用PRICE=40給符號常量賦值是錯誤的,運行結果:total=300,注意:PRICE與30之間不允許有=號。,11,符號常

8、量使用時的注意事項,注意: (1)一般習慣上用大寫字母表示,以便與變量區(qū)分開(如果用小寫字母也可以,只是為了與變量區(qū)分,是習慣而不是規(guī)定); (2) 定義符號常量時,不能以“;”結束; (3) 一個#define占一行,且要從第一列開始書寫; (4) 一個源程序文件中可含有若干個define命令,不同的define命令中指定的“標識符”不能相同;,12,三、 變量,變量: 在程序運行過程中,其值可以改變的量,稱為變量。 變量的定義:類型標識符 標識符1,標識符2,.標識符n;,注意事項: (P39) 在選擇變量名和其他標識符時,應做到“見名知意”。 不允許是關鍵字。 要求對變量須進行強制性定義

9、,即必須“先定義、后使用”。 每個變量必須被指定為一種確定類型,以便編譯時能為其分配存儲單元。,int a,b,c; /* a,b,c 為整型變量 */ float x,y,z; /* x,y,z 為單精度型變量 */,13,三、 變量,變量的組成要素 變量名 變量類型 變量值 例如: int a=15,數(shù)據(jù)15,內存,通過變量,可以為內存中的位置提供一個有意義的名稱,在對程序編譯連接時由編譯系統(tǒng)給每一個變量名分配對應的內存地址。 從變量中取值,實際上是通過變量名找到相應的內存地址,從該存儲單元中讀取數(shù)據(jù)。,a,15,14,3.3 數(shù)值型數(shù)據(jù)的表示,一、整型常量 表示形式 十進制整數(shù):與數(shù)學上

10、的整數(shù)表示相同。如:123,0,-456 八進制整數(shù):以數(shù)字0開頭, 如: 0123=1*82+2*81+3*80=(83)10 -011即(-11)8=(-9)10 十六進制整數(shù):以數(shù)字0和字母x開頭, 如:0 x123, -0 xa2 如: 0 x123=1*162+2*161+3*160=(291)10 -0 xa2即(-a2)16=(-162)10,* 八進制的數(shù)碼范圍為07; 018 * 十六進制的數(shù)碼除了數(shù)字09外, 還使用英文字母a f (或A F)表示1015。 如:0 x1e ,注意!,在VC+ 6.0中數(shù)值型數(shù)據(jù)有兩種:整型和實型,15,整數(shù)的存儲空間為4個字節(jié),即32個二

11、進制位。 取值范圍為-231231-1,即-21474836482147483647。,3.3 數(shù)值型數(shù)據(jù)的表示,在VC+ 6.0中數(shù)值型數(shù)據(jù)有兩種:整型和實型 一、整型常量,整數(shù)(有符號的整數(shù))在內存中存放的是它的補碼,無符號數(shù)沒有符號位,存放的就是原碼。整數(shù)占用的字節(jié)數(shù)與機型有關,32位機上占用4個字節(jié)。,16,整型數(shù)據(jù)在內存中的是按它的補碼來存放的。 如果要知道一個有符號的整數(shù)在內存中的存儲形式,一般方法是:,原碼反碼補碼,如果已知內存中的一個二進制編碼,還要用相反的方法將其轉換成有符號數(shù)。,請關注:,17,補充:帶符號數(shù)在計算機中的表示,整數(shù)在計算機中是按補碼存儲的。 原碼:用最高位作

12、符號位,0表示正數(shù),1表示負數(shù);其余各位表示數(shù)值的大小。 反碼:正數(shù)的反碼與原碼相同,負數(shù)的反碼是將原碼除最高位之外,其它各位按位取反。 補碼:正數(shù)的補碼與原碼相同,負數(shù)的補碼是將反碼的最低位加1。,數(shù)值數(shù)據(jù)有帶符號數(shù)和無符號數(shù)之分。,注意:負數(shù)的求補碼的另一種方法:將該數(shù)的絕對值的二進制形式,按位取反再加1。,18,34和-34的8位編碼,例如:整數(shù) 34 的8位(1字節(jié))編碼 原碼:00100010 反碼:00100010 補碼:00100010,例如:整數(shù)-34 的8位(1字節(jié))編碼 原碼:10100010 反碼:11011101 補碼:11011110,19,34和-34的16位編碼,

13、例如:整數(shù) 34 的16位(2字節(jié))編碼 原碼:00000000 00100010 反碼:00000000 00100010 補碼:00000000 00100010,例如:整數(shù)-34 的16位(2字節(jié))編碼 原碼:10000000 00100010 反碼:11111111 11011101 補碼:11111111 11011110,20,二、整型變量,在 C 語言中,可以使用整型變量存放一個整型數(shù)據(jù),使這個變量的值在程序運行時能夠發(fā)生變化。每定義一個變量, VC+ 系統(tǒng)就會給該變量分配存儲單元,用戶可隨時改變該存儲單元的內容。 但是,若存儲單元太大,會浪費存儲空間;若存儲單元太小,又影響存儲

14、的范圍和精度。因而,VC +規(guī)定了不同類型的整型變量。,3.3 數(shù)值型數(shù)據(jù)的表示,21,1、整型數(shù)據(jù)在內存中的存放形式 編譯系統(tǒng)為整型變量在內存中分配了4個字節(jié)的存儲單元,數(shù)值以補碼形式存儲。 2、整型變量的分類 整型變量的基本類型符為:int 根據(jù)數(shù)據(jù)所占的二進制位數(shù)分為:int,long ,short 同樣存儲長度的數(shù)據(jù)又分為:unsigned,signed(隱含) 故可組合出六種類型。,3、整型變量值的范圍 由機器中數(shù)據(jù)的存儲長度決定。(見下表),22,整型類型與數(shù)值范圍,如VC+6.0中,數(shù)據(jù)長度: short(2字節(jié))int(4字節(jié)) =long(4字節(jié)) 關鍵字 所占位數(shù) 取值范圍

15、 short 16(2B) -3276832767即-215(215-1) unsigned short 16(2B) 065535 即0(216-1) int 32(4B) -231(231-1) unsigned int 32(4B) 0(232-1) long 32(4B) -21474836482147483647 unsigned long 32(4B) 04294967295即0(232-1),如何判斷字節(jié)數(shù)呢?,printf(%dn,sizeof(unsigned long int);,23, 如果既不指定unsigned也不指定signed,則隱含為signed,因此存儲單元中

16、最高位為符號位(0為正,1為負) 如果指定unsigned,則存儲單元中全部二進制位用作存放數(shù)值本身。 無符號型變量只能存放不帶符號的整數(shù),而不能存放負數(shù)。 一個無符號整型變量存放的正數(shù)范圍比一般有符號整型變量中正數(shù)的范圍擴大一倍,例如: int a; /*變量a的數(shù)值范圍為-231 231-1,a的最大值2147483647 */ unsigned int b; /*變量b的數(shù)值范圍為0 232-1,b的最大值4294967295*/ 思考題: 如果變量a=32767,再加1會出現(xiàn)什么情況?(見下頁),注意!,24,整型數(shù)據(jù)的溢出問題,例3.3 整型數(shù)據(jù)的計算 #include main()

17、 int a,b; a=32767; b=a+1; printf(“%d,%dn”,a,b); 運行結果: 32767,32768,思考:將int b 改為short b,程 序運行后b的值是什么?,25,整型數(shù)據(jù)的溢出,例3.3” 整型數(shù)據(jù)的溢出 #include main() int a; short b; a=32767; b=a+1; printf(“%d,%dn”,a,b); 運行結果: 32767,-32768,32767,-32768,如下圖: a: b:,注意:此時,32767加1得不到32768,而得到-32768,這2個例子就說明了數(shù)據(jù)在內存中的存儲形式不同,結果會不同!,

18、26,4、整型變量的定義,整型變量的定義形式:,類型標識符 變量名1,變量名2,變量名n;,如: int a,b,c;,long int aa,bb,cc;,long a1,a2;,unsigned u1,u2;,其中int為類型標識符,a,b,c為變量名。,其中l(wèi)ong int為類型標識符,aa,bb,cc為變量名。,其中l(wèi)ong為類型標識符,a1,a2為變量名。,其中unsigned為類型標識符,u1,u2為變量名。,變量必須“先定義、后使用”。,自己設定,滿足標識符的規(guī)定。,;不可省,對變量的定義一般是放在一個函數(shù)的開頭聲明部分。,27,程序L3-2.C功能:整型變量的定義及使用,#in

19、clude main() int a,b,c,d; unsigned u; a=12;b=-24;u=10; c=a+u;d=b+u; printf(“a+u=%d,b+u=%dn”,c,d); 運行結果: a+u=22,b+u=-14,說明:不同種類的整型數(shù)據(jù)可以進行算術運算!,28,三、整型常量的類型,如果一個整數(shù)的值在-231231-1范圍內,認為它是int型,可以賦值給int型和long int型變量。 VC+6.0中,分配給long和int的內存空間相同,所以一個int型常量既可賦值給long也可給int型變量。 一個整常量后加一個字母u或U,認為是unsigned int型(即存儲

20、單元中最高位不作為符號位,作為數(shù)據(jù)本身)例如:若寫成-12345u,則先將-12345轉換成其補碼53191,然后按無符號存儲。 一個整常量后面加一個字母l或L,認為是long int型。,常量的類型有哪些?如何將整型常量賦給一個整型變量?請注意以下幾點:,29,3.4 實型(浮點型)數(shù)據(jù),在程序設計中,不僅要使用到各種類型的整數(shù),而且更多地要使用實數(shù)。 如:求下面數(shù)列的前100項之和:,就必須使用實型數(shù)據(jù)。,30,一、浮點型常量的表示形式,十進制小數(shù)形式:包含整數(shù)部分、小數(shù)點和小數(shù)部分, 如: 0.12,12., 23.0,1.0, .3,-2.5 等。注意:小數(shù)點不能省略。 指數(shù)形式: “

21、十進制小數(shù)” + “e(或E)” “十進制數(shù)整數(shù)” 。 如:2.7E12,123e+2,2.45e-2分別表示2.71012,123102,2.4510-2 但注意: 小數(shù)點不能單獨出現(xiàn); 0. .0 . e或E的兩邊必須有數(shù)字,且e后必須為整數(shù);如:6E0.2 e5 ,例如:e+3、2.03e+0.5、.e3、e 都是非法的實型常量表示方法。,在字母E或e之前的小數(shù)部分中,小數(shù)點左邊應有一位且只能有一位非0的數(shù)字,稱為“規(guī)范化的指數(shù)形式”。例:1.23e2是規(guī)范化的, 0.0123e2,12.3e1不是規(guī)范化指數(shù)形式。 一個浮點數(shù)在用指數(shù)形式輸出時,是按規(guī)范化的指數(shù)形式輸出的。,31,二、浮

22、點型變量,變量類型 標識符 存儲單元 數(shù)值范圍 有效數(shù)字,單精度 float 4字節(jié)(32位) 10-3810+38 67位,雙精度 double 8字節(jié) (64位) 10-30810+308 1516位,1、浮點型數(shù)據(jù)在內存中的存放形式 占4個字節(jié)(32位),分為小數(shù)部分和指數(shù)部分。 小數(shù)部分占的位數(shù)越多,數(shù)的有效數(shù)字越多,精度就越高。 指數(shù)部分越大(占的位數(shù)越多),表示數(shù)值范圍越大。 如果要求精度特別高,可以采用雙精度浮點類型,有效位達16-17位。 2、浮點型變量的分類,32,三、浮點型變量的定義,浮點型變量的定義形式:,類型標識符 變量名1,變量名2,變量名n;,如: float a,

23、b,c;,double a1,a2;,其中float為類型標識符,a,b,c為變量名。,其中double為類型標識符,a1,a2為變量名。,對每一個浮點型變量都應在使用前加以定義,33,四、浮點型數(shù)據(jù)的舍入誤差,例如: #include main() float a,b; a=123456.789e5; b=a+20; printf(“%f n”,b); ,輸出結果:12345678848.000000,注意:應避免一個很大的數(shù)和一個很小的數(shù)直接相加、減,否則會“丟失”小的數(shù)。即有效數(shù)字以外的數(shù)字就不精確了。,34,五、浮點型常量的類型,C語言編譯系統(tǒng)常將浮點型常量作為double 型來處理。

24、 例:float f f=2.45678*4523.65 系統(tǒng)先將兩數(shù)作為double 型,運算之后的結果,取前7位賦給float型的f. 一個浮點型常量可以賦值給float型、double 型變量,那么系統(tǒng)會根據(jù)變量的類型截取實型常量中相應的有效位數(shù)字。 例:float a; a=11111.111 此時,a只能接收7位有效數(shù)字,最后兩位小數(shù)就不起作用。 如果將a改為double型,則9位有效數(shù)字就都存儲在變量a中了。,35,3.5 字符型數(shù)據(jù),在程序設計中,除了需要使用整型和實型數(shù)據(jù)之外,還需要另外一種很重要的數(shù)據(jù)類型,即字符型數(shù)據(jù),如姓名,文字信息等,都是字符型數(shù)據(jù),也叫文字型數(shù)據(jù)。 文

25、字型數(shù)據(jù)有兩種類型:單個字符和字符串,36,基本ASCII碼表的前32個字符為控制字符(ASCII碼值為031)。 接著為標準英文鍵盤上的每一個字符都規(guī)定了一個ASCII碼值,字符在內存中的存儲格式按照ASCII碼值所對應的二進制數(shù)確定。,空 格32,00100000,A65,01000001,a97,01100001,b98,01100010,37,一、字符常量,字符常量: 用單引號括起來的一個字符。如: A、e、?等。 由反斜杠()引導的轉義字符。如:“n”表換行符。,注意:a與a不同,前者為變量,后者為字符常量。 9與9也不同,前者為整型常量,后者是字符常量。 a與A是不同的字符常量。,

26、每個字符型數(shù)據(jù)在內存中占一個字節(jié);其存儲的內容為該字符在ASCII碼表(見附錄A)中對應的數(shù)值。,38,以“”開頭的字符序列稱為轉義字符,這些字符的含義不是其本身,而是轉成了新的意義。,n換行,將當前位置移到下一行開頭 t 換區(qū)(橫向跳格,跳到下一個輸出區(qū),一區(qū)占8列) b退格(刪除前面的一個字符) r 回車,將當前位置移到本行開頭 代表一個反斜杠字符( ) 代表一個單引號字符 ( ) ” 代表一個雙引號字符 () ddd13位8進制數(shù)所表示的字符 xhh12位16進制數(shù)所表示的字符,字符形式功能,39,轉義字符的應用舉例,printf(n1234nabcdn);,printf(7);,pri

27、ntf(nabtcdtefn);,printf(n1234bn);,printf(40n);,printf( x41n);,1234 abcd,響一聲鈴聲,ab cd ef,123,空格(相當于”040n”)(空格的ASCII碼=32), A,printf(“abccden”); printf(“101 x56n”),abccde (9個字符),A V (2個字符),重要考點:數(shù)字符的個數(shù)是關鍵!,40,二、字符變量,字符變量: 只能存放一個字符并能改變其值的變量。 字符型變量在內存中占1個字節(jié)。,字符變量的定義: char 變量名; 例如:char c1,c2,c3,c4;,變量c1,c2,

28、c3,c4 中可存儲字符數(shù)據(jù)、介于-128127的整數(shù)或者轉義字符。,例如:字符A的ASCII碼為: 65D(十進制)=41H(十六進制)=101Q(八進制) 字符A可以表示為A、x41、101。,字符變量分類: char 和 unsigned char;,41,三、字符型數(shù)據(jù)在內存中的存儲形式及使用方法,存儲形式: 按 ASCII碼存儲。,使用方法: 按字符使用(%c):則使用字符本身。按數(shù)值使用(%d):則使用該字符的ASCII碼值。,例如a=a,并不是把字符a本身放到內存單元中,而是將該字符的相應的ASCII碼97放到內存單元中。,42,四、字符型數(shù)據(jù)使用方法舉例(見P50),例3.6

29、main( ) char c1,c2,c3=007 ; c1=A; c2=B; printf(c1=%c,c2=%cn,c1,c2); printf(c1=%d,c2=%dn,c1,c2); printf(c3=%c,c3=%d n,c3 ); ,運行結果如下: c1=A,c2=B c1=65,c2=66 一聲響,c3=7,但注意:一個字符變量不可以存放一個字符串,所以字符不能用雙引號括起來。,43,例3.7 大小寫字母的轉換,#include main() char c1,c2; c1=a;c2=b; c1=c1-32; c2=c2-32; printf(“%c%c”,c1,c2); ,運行

30、結果: A B,注意字符的相加、字符的運算問題: 1.字符型數(shù)據(jù)和整型數(shù)據(jù)之間可以通用,可直接進行算術運算. 2.對字符數(shù)據(jù)進行算術運算,相當于對它們的ASCII進行算術運算. 3.字符型與數(shù)值型可以互相賦值。 4.一個字符數(shù)據(jù)既可以字符形式輸出,也可以整數(shù)形式輸出.,44,1、VC+將字符變量默認定義為signed char型。其存儲單元的最高位為符號位,取值范圍是-128127。 2、如果在字符變量中存放一個ASCII碼為0127間的字符,由于字節(jié)中最高位為0,因此用%d格式輸出字符變量時,是一個正整數(shù)。 3、如果在字符變量中存放一個ASCII碼為128255間的字符,由于字節(jié)中最高位為1

31、,因此用%d格式輸出字符變量時,是一個負整數(shù)。,例如: char c=130; printf(“%d”,c); 結果:-126 字符按有符號處理,例如: unsigned char c=130; printf(“%d”,c); 結果:130 字符按無符號處理,需要說明:,45,五、字符串常量,字符串常量: 一對雙引號括起來的字符序列,叫字符串常量,如:“ABCE”、“a”、”A”都是一個字符串常量。,注意: (1)字符串常量不能賦給字符變量。 (2)字符常量與字符串常量不同。,例如:char c1=A; 是可以的, 但 char c1=A; 是不合法的。,46,字符串中的字符按照從左到右的順序

32、,依次存儲在一段連續(xù)的空間里,其中每一個字符占用一個字節(jié),其內容為該字符在ASCII碼表中對應的數(shù)值。 注意:C語言的字符串在實際存儲時,將自動在字符串尾部加了一個結束標志0(其ASCII碼值為0),但0不會輸出。 C語言沒有專門的字符串變量。如果需要存儲字符串的話,須采用字符數(shù)組。 試分析:a與”a”相同嗎?為什么? 提示:輸出的結果相同(0不輸出),a,字符串在內存的存儲形式:,47,作業(yè)(P66),3.6 3.7 3.8,48,總結:常量和變量,常量與符號常量 常量是指在程序運行中,其數(shù)值不能被改變的量。 常量又可分為直接常量和符號常量。,49,120 、 -100、 0; 0120、

33、072; 0 xFFFF、 0 x1e、0X28AF、0XED4 ; 120L、200L ; 長整型常量 3.14、 -3.1、 5.12E-6 ; a、 #、 n、 101 ; 099、 12f、 0 xg、48EA ; 019.5、1e-08; 實型常量只能用十進制形式表示,不能用8,16進制表示 2.1E10.2、 E-6、 6.4E+4.8、 E9 ; “changsha”、 “+?ab” ; 字符串常量 、 p 、 、 ab ;,1、直接常量:是在程序中直接引用的數(shù)據(jù)。,請判斷這些常量正確與否?,注意, p ab 到計算機中,都認為是轉義字符,50,2、符號常量 是用標識符來表示一個

34、數(shù)據(jù);在程序不能再次給它賦值。 定義形式: #define 標識符 常量數(shù)據(jù) 例如: #define PI 3.14159 在程序預處理時,凡是出現(xiàn)標識符PI的地方都將用數(shù)據(jù)3.14159來替換。 如: 2*2.3*PI 就等價于 2*2.3*3.14159。,二、 變量 變量是指以標識符為名字,其值可以改變的量。 變量代表計算機內存中的某一存儲空間,該存儲空間 中存放的數(shù)據(jù)就是變量的值。 在同一程序塊中,變量不能被重復定義。 使用變量時必須“先定義,后使用”。 變量三要素:變量名,變量類型,變量值,51,存儲單元的大小與所表示數(shù)值范圍的關系,存儲單元大小 無符號數(shù)范圍 有符號數(shù)范圍 1字節(jié)(

35、8位) 0255(28-1) -128127(-2-727-1) 2字節(jié)(16位) 065535(216-1) -3276832767(-2-15215-1) 4字節(jié)(32位)0(232-1)- 231(231-1),例如: main() int a,b,c; a=123;b=56; c=a+b; printf(c=%dn,c); ,運行結果:c=179,例如:main() int a,b; short c; a=32768;b=2; c=a+b; printf(c=%dn,c); ,運行結果:c=-32766 如下圖:,例如: main() int a,b,c; a=32768;b=2; c

36、=a+b; printf(c=%dn,c); ,運行結果:c=32770,52,32770存入整型變量中的情況,16384+8192+4096+2048+1024+512+128+64+32+16+8+4+2=32766,53,八位二進制編碼所表示的有符號數(shù),二進制數(shù) 無符號數(shù) 原碼 反碼 補碼 00000000 0 +0 +0 +0 00000001 1 +1 +1 +1 01111111 127 +127 +127 +127 10000000 128 -0 -127 -128 10000001 129 -1 -126 -127 11111110 254 -126 -1 -2 1111111

37、1 255 -127 -0 -1,54,3.6 變量賦值,變量的初始化: 在定義變量的同時為變量預先設置初值,稱為變量的初始化。 如: int a=3; float x=5.89; int a,b,c=8;,在定義一個變量時,系統(tǒng)自動根據(jù)變量類型分配了存儲空間。但是當變量的值即存儲在該空間的值并未給出時,其值可能是隨機放入其中的垃圾值,所以變量需要預置一個值,即賦值。 賦值操作通過賦值符號“=”,把右邊的值賦給左邊的變量。 變量名=表達式 例如:a=3;a=a+1; f=3*4+2;a=43*3+b都是合法的賦值形式。 43*3+b=a 是非法的,55,3.6 變量賦初值,對幾個變量賦同一個值

38、,不允許這樣賦初值:int a=b=c=8; 可以這樣: int a=8,b=8,c=8; 也可以: int a, b, c; a=b=c=8; 注意事項:C語言中,=和= 的區(qū)別? 賦值運算符的結合性為從右至左,其優(yōu)先級低于算術運算符、關系運算符和邏輯運算符。僅高于逗號運算符。 例如:i=j=2+3; 注意事項: (1)在C語言中,“”為賦值運算符號,而不是數(shù)學中的”等號”; (2)賦值運算符“”左邊必須是變量名,不能是表達式; (3)賦值運算符“”兩端的類型不一致時,系統(tǒng)將自動進行類型轉換。,見下頁,56,3.6 變量賦值的自動類型轉換(參見課本P60),如果賦值時兩側類型不一致時,系統(tǒng)將

39、自動進行類型轉換: 將整數(shù)賦給一個浮點型變量時,系統(tǒng)將保持數(shù)值不變并且以浮點小數(shù)形式存儲到變量中。如 float f; f=12;此時f=12.000000,即先將12轉換成12.000000,再存儲在f中。 將整型12賦給double型變量f,則f=12.0000000000000 (補足15位)。 將實數(shù)賦給一個整型變量時,系統(tǒng)自動舍棄小數(shù)部分。如 int a; a=3.9;此時以 a=3的形式存儲在整型變量中。 將double型值賦給float型變量,則截取其前面7位有效數(shù)字存放。,57,當char型值賦給int型變量時,由于char型數(shù)據(jù)只占一個字節(jié),而int型占4個字節(jié),則將char

40、型數(shù)據(jù)放入到int型變量的低8位中,對于int型變量的高8位,不同的系統(tǒng)實現(xiàn)的情況不同,一般當該字符的ASCII值小于127(無論是unsigned還是signed)時,系統(tǒng)將int型變量的高字節(jié)置0、低字節(jié)存放該字符的ASCII值;例如:int x; x=A; 即x=65 (0000 0000 0000 0000 0000 0000 0100 0001). 若是signed char,最高位又為1,或 ASCII值大于127,系統(tǒng)將整型變量的高字節(jié)全補1,即”符號擴展”。 將int、short、long賦給char變量時,只將其低8位原封不動地送到char型變量中。(注意:此時得到的值就不是

41、預想的值) 將int賦給long,不需要進行”符號擴展”,可以互相賦值。,符號擴展: 符號位為0,剩余的高位全補0; 符號位為1,剩余的高位全補1。,3.6 變量賦值的自動類型轉換(參見課本P60),58,舉例:賦值時類型自動轉換示例,#include main() int a,x; float f; a=3.9; f=12; x=A; printf(“a=%d ,f=%f, x=%dn”,a,f,x); ,main() long a=65535; printf(“a=%ldn”,a); printf(“a=%un”,a); printf(“a=%dn”,a); ,運行結果: a=65535

42、a=65535 a=65535,運行結果: a=3,f=12.000000,x=65,思考:將long改為int,結果怎樣?,59,3.7 各類數(shù)值型數(shù)據(jù)間的混合運算,各數(shù)據(jù)類型之間是可以進行混合運算的,在進行運算時,不同類型的數(shù)據(jù)要先轉換成同一類型,然后才能進行運算。數(shù)據(jù)類型的級別:,橫向箭頭表示必須先轉成縱向類型才能進行運算,縱向箭頭表示當運算對象為不同類型時轉換的方向,箭頭只表示數(shù)據(jù)類型級別的高級,不是進行一步步轉換,注意:類型轉換是系統(tǒng)自動進行的,60,3.7 各類數(shù)值型數(shù)據(jù)間的混合運算,28+32,int,28+32.5,float,28+a,int,double,結果的類型,61,

43、總結自動類型轉換,C語言規(guī)定,不同類型的數(shù)據(jù)在參加運算前自動轉換成相同類型,再進行運算。轉換規(guī)則: 表達式中只要有float型或double型,自動轉換成double型再運算,結果為double型。 如果表達式中無float型或double型,但是有l(wèi)ong型,數(shù)據(jù)自動轉換成long型再運算,結果為long型。 char型和int型運算,先轉換為int型,結果為int型。 char型、int型和long型運算,先轉換為long型,結果為long 型。除此之外,只要有float型或double型,自動轉換成double型再運算,結果為double型。 總而言之:不同類型的數(shù)據(jù)發(fā)生轉換時,遵循低級

44、類型向高級類型轉換的原則。如:int和double運算,先將int型轉換為double型,再進行運算,結果為double型。,62,#include main() float x,y; long m,n; x=3/2+8/3; y=3.0/2+8/3.0; m=1*2*3*4*5*6*7*8*9; n=1L*2*3*4*5*6*7*8*9; printf(“x=%f,y=%f,m=%ld,n=%ldn”,x,y,m,n); 運行結果: x=3.000000,y=4.166667,m=362880,n=362880,例如:自動類型轉換,63,回顧前面所講,C語言的類型修飾符: short、 in

45、t 、 long signed、 unsigned short 型的存儲長度為2個字節(jié),范圍-215215-1。 int ,long int(簡寫為long)的存儲長度為4個字節(jié),范圍 -231231-1,用于存儲整數(shù)超過short int型取值范圍的情況。 signed和unsigned適用于char型、int型和long型三種類型,區(qū)別在于它們的最高位是否作為符號位。 unsigned char型取值范圍0255(即028-1),unsigned int型和unsigned long型取值范圍(0232-1)。,64,例如:類型修飾符unsigned的使用,#include main()

46、char a1,b1; unsigned char a2,b2; a1=127;b1=129; a2=127;b2=129; printf(“a1=%d,a2=%u,b1=%d,b2=%un”,a1,a2,b1,b2); 運行結果: a1=127,a2=127,b1=-127,b2=129,說明:127的二進制原碼是0111111,+129的二進制碼是10000001和-127放在存儲器里一個字節(jié)的形式相同。 注意:負數(shù)在存儲器里是按補碼形式存儲。(-127)補=(10000001)2,65,3.8 運算符和表達式,按操作功能運算符大致可分為:算術運算符、關系運算符、邏輯運算符、按位運算符以及

47、其它運算符如賦值運算符、條件運算符、逗號運算符等。 表達式是由操作數(shù)、運算符及括號組成的序列。,算術運算符 + - * / % 關系運算符 = = = != 邏輯運算符 ! int b=6,c=3; 求解: a*b/c-1.5+a+fabs(-5)=?,2、算術表達式,70,float a=2.0; int b =6,c =3; a*b/c -1.5 +a +fabs(-5),12.0/3,5,4.0 - 1.5,2.5 + 97(int),99.5 + 5,104.5(double),思考:a=1.7,b=2.4,計算a+3*-2/(int)(a+b)-12的結果,結果:-11.300000

48、,71,二、強制類型轉換運算符,強制類型轉換運算符為單目運算符,使用的形式為: (類型名)(轉換對象) 功能:將數(shù)據(jù)類型進行強制轉換,但原來變量類型未變化 優(yōu)先級:僅次于括號類 結合性:自右向左 注意事項:類型名一定要用括號括起來。,例如:(int)(2. 5)%3 的結果為2 ; 因為%兩邊必須為整型 (float)5/4的結果為1.250000;先將5轉換為5.0,再整除 (float)2/3的結果為0.666667;先將2轉換為2.0,再整除 float(2/3)則出錯; 先整除,結果為0,強制類型轉 換后,結果為0.000000 分析:(int)x+y和(int)(x+y)有區(qū)別嗎?,

49、72,強制類型轉換最主要的用途 滿足一些運算符對類型的特殊要求,例如:%運算符,要求兩側的數(shù)據(jù)為整數(shù), (int)(2.5)%3 防止丟失整數(shù)除法中的小數(shù)部分, 例如: int x=3,y=2; float f; f=(float)x/y; 此時f的值為1.500000。如果不用強制類型轉換,即f=x/y,結果為1.000000,73,三、自增、自減運算符,自增、自減運算符主要用于給一個變量加1或減1。 自增、自減運算符:單目運算符。 運算符:+(自增):如a+, +a,都等價于a=a+1. - -(自減): 如a-, -a,都等價于a=a-1 功能:使變量的值自增1或自減1 自增和自減運算符

50、是單目運算符,放到變量前面:前置方式;放到變量后面:后置方式;這兩種方式同樣實現(xiàn)了變量的自增和自減運算。但結果是不同的。 前置運算時變量先做自增或自減運算,再將變化后的變量值參加整個表達式中的其他運算。后置運算時變量在參加表達式中的其他運算之后,再自增或自減運算。,74,例如:a=3; b=a+; 執(zhí)行后,b=3,a=4。等價于三條語句: a=3; b=a; a=a+1; 而b=+a;執(zhí)行后,b=4,a=4。等價于三條語句: a=3; a=a+1; b=a; 例如:a=3;b=a-;執(zhí)行后結果是:b=3,a=2。等價于三條語句: a=3; b=a; a=a-1; 而b=-a;執(zhí)行后結果是:b=

51、2,a=2。等價于三條語句: a=3; a=a-1; b=a; 例如:a=3; printf(“%dn”, a+); 輸出結果為3,輸出后a的值為4。 例如:a=3; printf(“%dn”, +a); 輸出結果為4,輸出后a的值為4。,75,優(yōu)先級:僅次于括號類,高于算術運算符,而與負值運算符同級,“+”與”- -“是同優(yōu)先級別。 + 和- -的結合性:從右向左, 注意:“+”“- -”只能用于變量而不能用于常量和表達式。 例如:i=2; j=-i+; 等價于:j=-(i+); 而不能等價于j=(-i)+; 即: j=-i;i=i+1;所以j的值為-2,i的值為3。 一個變量的前置自增(減

52、)運算和后置增(減)運算僅表明該變量使用其值參加運算與其值自身變化之間的先后關系。即前置時,先自增(減)、后使用。后置時,先使用、后自增(減)。, 注意 “+”或“-”自增與自減運算符的使用。 如:設i=3,k=(i+)+(i+)+(i+),k=? 如:設i=3,j=4,k=i+j,k=? 提示:C編譯系統(tǒng)在處理時盡可能多地(自左至右)將若干個字符組成一個運算符,k=9,i=6,k=(i+)+j i=4,j=4,k=7,三、自增、自減運算符,76,#include main() int a1,a2,a3,a4,b1,b2,b3,b4; a1=a2=a3=a4=10; b1=(a1+)+(a1+

53、)+(a1+); b2=(+a2)+(+a2)+(+a2); b3= (a3-)+(a3-)+(a3-); b4=(-a4)+(-a4)+(-a4); printf(“a1=%d, a2=%d, b1=%d, b2=%dn”,a1,a2,b1,b2); printf(“a3=%d, a4=%d, b3=%d, b4=%dn”,a3,a4,b3,b4); 運行結果:a1=13,a2=13,b1=30,b2=39 a3=7,a4=7,b3=30,b4=21,三、自增、自減運算符,/*先算+,得到a2=13,然后3個a2相加*/,/*先將3個a1相加得到b1,然后在算+,得到a1*/,調試程序,一般像 i+ + +i, +j + +j 這些 undefined behavior,還是避免的好,不要依賴特定編譯器的實現(xiàn)。結果與編譯器有關,沒必要太深入研究,只要知道左結合和右結合是怎么回事就行了。,注意:,77,3.9 賦值運算符和賦值表達式,賦值運算符: = 功能:將數(shù)據(jù)賦給一個變量。 優(yōu)先級: 僅優(yōu)先于逗號運算符。 結合性: 自右向左 注意事項:賦值運算符號不等于數(shù)學中的“等號”。,例如:a=3 將常量3賦給變

溫馨提示

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

評論

0/150

提交評論