第2章數(shù)據(jù)類型與運算符_第1頁
第2章數(shù)據(jù)類型與運算符_第2頁
第2章數(shù)據(jù)類型與運算符_第3頁
第2章數(shù)據(jù)類型與運算符_第4頁
第2章數(shù)據(jù)類型與運算符_第5頁
已閱讀5頁,還剩26頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、博學(xué)谷讓IT教學(xué)更簡單,讓IT學(xué)習(xí)更有效第2章 數(shù)據(jù)類型與運算符學(xué)習(xí)目標(biāo)u 理解進制和進制轉(zhuǎn)換u 牢記C語言中的關(guān)鍵字和標(biāo)識符定義規(guī)則u 掌握不同數(shù)據(jù)類型間的轉(zhuǎn)換u 學(xué)會使用運算符進行運用通過上一章的學(xué)習(xí),相信大家對C語言已經(jīng)有了一個初步認(rèn)知。接下來的第2章將針對C語言開發(fā)中必須要掌握的進制、常量、變量、運算符等基礎(chǔ)知識進行講解。2.1 數(shù)據(jù)存儲的原理 2.1.1 進制進制是一種計數(shù)機制,它可以使用有限的數(shù)字符號代表所有的數(shù)值。對于任何一種進制X進制,就表示某一位置上的數(shù)在運算時逢X進一位。實際生活中也有很多進制的應(yīng)用場景,例如時間每過60秒,分鐘就會加1,這就是六十進制。再比如對學(xué)生進行分組

2、時,假設(shè)8人一組,可以讓學(xué)生進行報數(shù),報滿8個數(shù)就多了一個小組,這就是八進制。接下來將針對C語言中的二進制、八進制和十六進制分別進行講解。1、二進制在絕大多數(shù)計算機系統(tǒng)中,數(shù)據(jù)都是通過二進制的形式存在的。二進制是計算技術(shù)中廣泛采用的一種數(shù)制。二進制數(shù)據(jù)是用0和1兩個符號來表示的數(shù)。它的基數(shù)為2,進位規(guī)則是“逢二進一”。例如計算二進制算術(shù)“1+1”,因為個位數(shù)1是該位上最大的數(shù),所以再加1后就會向十位進一,個位改為0,所以二進制算術(shù)“1+1”的結(jié)果是二進制數(shù)10。為了幫助大家更好地理解二進制,接下來通過二進制和十進制的對比來描述二進制的表示方式,如表2-1所示。表2-1 十進制與二進制對照表十進

3、制二進制十進制二進制00000501011000160110200107011130011810004010091001從表2-1可以看出,當(dāng)用二進制表示十進制數(shù)字2時,由于二進制的符號只有0和1,所以根據(jù)“逢二進一”的規(guī)則,需要向高位進一位,表示為0010。同理,使用二進制表示十進制數(shù)字4時,繼續(xù)向高位進一位,表示為0100。需要注意的是,十進制和二進制只是針對數(shù)字的不同表示方式,無論采用哪種方式表示一個數(shù),它的值都是一樣的。以十進制數(shù)7為例,十進制由符號“7”組成 ,而二進制由符號 “0”、“1”、“1”和“1”組成。2、八進制八進制是一種“逢八進一”的進制,它由07這八個符號來描述。同樣

4、地,此處通過十進制和八進制的對比來描述八進制的表示方式,如表2-2所示。表2-2 十進制與八進制對照表十進制八進制十進制八進制009111110122211133312144413155514166615177716208101721從表2-2中可以看出,當(dāng)使用八進制表示十進制數(shù)字8時,由于表示八進制的符號只有07,因此,根據(jù)逢八進一的規(guī)則,需要向高位進一位,表示為10。同理,使用八進制表示十進制數(shù)字16時,繼續(xù)向高位進一位,表示為20。3、十六進制十六進制是一種“逢十六進一”的進制,它由09、AF這十六個符號來描述。下面通過十進制和十六進制的對比來描述十六進制的表示方式,如表2-3所示。表2

5、-3 十進制與十六進制對照表十進制十六進制十進制十六進制00171111181222191333201444211555221666231777241888251999261A10A271B11B281C12C291D13D301E14E311F15F322016103321從表2-3中可以看出,當(dāng)使用十六進制表示十進制數(shù)字16時,由于表示十六進制的符號只有09、AF,因此,根據(jù)逢“逢十六進一”的規(guī)則,需要向高位進一位,表示為10。同理,使用十六進制表示十進制數(shù)字32時,繼續(xù)向高位進一位,表示為20。2.1.2 進制轉(zhuǎn)換通過前面內(nèi)容的學(xué)習(xí),讀者應(yīng)該知道在計算機中一個數(shù)值可以用不同的進制形式來表

6、示,但實際上,不管是哪種進制形式來表示,數(shù)值本身是不會發(fā)生變化的。因此,各種進制之間可以輕松地實現(xiàn)轉(zhuǎn)換,下面就以十進制、二進制、八進制、十六進制為例來講解如何實現(xiàn)進制轉(zhuǎn)換。一、十進制與二進制之間的轉(zhuǎn)換十進制與二進制之間的轉(zhuǎn)換是最常見也是必須掌握的一種進制轉(zhuǎn)換方式,下面針對十進制轉(zhuǎn)二進制和二進制轉(zhuǎn)十進制的方式分別進行講解。1、十進制轉(zhuǎn)二進制十進制轉(zhuǎn)換成二進制可以采用除2取余的方式。也就是說將要轉(zhuǎn)換的數(shù),先除以2,獲得商和余數(shù),將商繼續(xù)除以2,獲得商和余數(shù),此過程一直重復(fù)直到商為0。最后將所有得到的余數(shù)倒序排列,即可得到轉(zhuǎn)換結(jié)果。接下來就以十進制的6轉(zhuǎn)換為二進制為例進行說明,其演算過程如圖2-1所

7、示。圖2-1 十進制轉(zhuǎn)二進制從圖2-1中可以看出,十進制的6連續(xù)三次除以2后,得到的余數(shù)依次是:0、1、1。將所有余數(shù)倒序排列后為110,因此,十進制的6轉(zhuǎn)換成二進制后的結(jié)果是110。2、二進制轉(zhuǎn)十進制二進制轉(zhuǎn)化成十進制要從右到左用二進制位上的每個數(shù)去乘以2的相應(yīng)次方,例如,將最右邊第一位的數(shù)乘以2的0次方,第二位的數(shù)乘以2的1次方,第n位的數(shù)乘以2的n-1次方,然后把所有乘的結(jié)果相加,得到的結(jié)果就是轉(zhuǎn)換后的十進制。例如,把一個二進制數(shù)0110 0100轉(zhuǎn)換為10進制,轉(zhuǎn)換方式如下:0 * 20 + 0 * 21 + 1 * 22 + 0 * 23 + 0 * 24 + 1 * 25 + 1

8、* 26+ 0 * 27 = 100由于0乘以多少都是0,所以上述表達式也可以簡寫為:1 * 22 + 1 * 25 + 1 * 26 = 100得到的結(jié)果100就是二進制數(shù)0110 0100轉(zhuǎn)化后的十進制表現(xiàn)形式。二、八進制與二進制之間的轉(zhuǎn)換該類轉(zhuǎn)換通常是二進制轉(zhuǎn)換成八進制,在轉(zhuǎn)換的過程中有一個技巧,就是將二進制數(shù)自右向左每三位分成一段(若不足三位,左邊用0補齊),然后將二進制每段的三位轉(zhuǎn)為八進制的一位,轉(zhuǎn)換過程中數(shù)值的對應(yīng)關(guān)系如表2-4所示。表2-4 二進制和八進制數(shù)值對應(yīng)表二進制八進制00000011010201131004101511061117接下來,就以將二進制數(shù)00101010為

9、例來演示如何轉(zhuǎn)為八進制,具體演算過程如下:(1)每三位分成一段,結(jié)果為:000 101 010;(2)將每段的數(shù)值分別查表替換,結(jié)果如下:010 à 2101 à 5000 à 0(3)將替換的結(jié)果進行組合,組合后的八進制為0052(注意八進制必須以0開頭)。八進制轉(zhuǎn)換成二進制的過程正好相反,只需將八進制數(shù)中每一位數(shù)轉(zhuǎn)換成對應(yīng)的三位二進制數(shù)即可。三、十六進制與二進制之間的轉(zhuǎn)換將二進制轉(zhuǎn)十六進制時,與轉(zhuǎn)八進制類似,不同的是要將二進制數(shù)每四位分成一段(若不足4位用0補齊),查表轉(zhuǎn)換即可。二進制轉(zhuǎn)十六進制過程中數(shù)值的對應(yīng)關(guān)系如表2-5所示。表2-5 二進制和十六進制數(shù)值

10、對應(yīng)表二進制十六進制二進制十六進制00000100080001110019001021010A001131011B010041100C010151101D011061110E011171111F接下來,二進制數(shù)01010110轉(zhuǎn)為十六進制,具體步驟如下:(1)每四位分成一段,結(jié)果為:0101 0110;(2)將每段的數(shù)值分別查表替換,結(jié)果如下:0110 à 60101 à 5(3)將替換的結(jié)果進行組合,轉(zhuǎn)換的結(jié)果為:0x56或0X56(注意十六進制必須以0x或者0X開頭)。上述講解了二進制與其他進制的轉(zhuǎn)換,除二進制外,其他進制之間的轉(zhuǎn)換也很簡單,只需將它們轉(zhuǎn)換成二進制數(shù),然

11、后將二進制轉(zhuǎn)為其他進制即可。&多學(xué)一招:小數(shù)的二進制十進制小數(shù)轉(zhuǎn)換為二進制采用“乘2取整”規(guī)則。方法是用2乘以十進制小數(shù)部分,將其結(jié)果的整數(shù)部分去掉,用2乘以余下的小數(shù)部分,再去掉其結(jié)果的整數(shù)部分;如此繼續(xù)下去,直到余下的小數(shù)部分為0或滿足所要求的精度為準(zhǔn)。最后將每次得到的整數(shù)部分(0或1)按先后順序從前至后排列,即為小數(shù)對應(yīng)的二進制。例如:將小數(shù)0.8125轉(zhuǎn)換為二進制,轉(zhuǎn)換過程如圖2-2所示。圖2-2 十進制小數(shù)轉(zhuǎn)換為二進制 由圖2-2所示十進制0.8125連續(xù)4次乘以2使得小數(shù)部分為0,所得整數(shù)依次為1、1、0、1,所以轉(zhuǎn)換后結(jié)果為0.1101。 需要注意的是,有些十進制小數(shù)不一

12、定能完全精確的轉(zhuǎn)換為二進制,可以根據(jù)精度要求轉(zhuǎn)換到小數(shù)點后某一位為止。2.1.3 原碼、反碼、補碼一個數(shù)在計算機中的二進制存儲形式,叫做這個數(shù)的機器數(shù)。機器數(shù)是帶符號的,在計算機中用一個數(shù)的最高位存放符號,最高位為0表示是正數(shù),最高位為1表示是負(fù)數(shù)。比如十進制數(shù)3的機器數(shù)是0000 0011;如果是-3,它的機器數(shù)就是1000 0011。帶符號位的機器數(shù)對應(yīng)的真正數(shù)值稱為機器數(shù)的真值。例如,0000 0011的真值是3,1000 0011的真值是-3。需要注意的是,機器數(shù)的真值和機器數(shù)轉(zhuǎn)換成十進制數(shù)是不一樣的,例如1000 0011轉(zhuǎn)換成十進制數(shù)是131,但由于機器數(shù)的最高位存放符號,因此機器

13、數(shù)的真值是-3。機器數(shù)有原碼、補碼、反碼這三種表現(xiàn)形式。計算機將一個數(shù)以二進制形式存儲時,會將該數(shù)分別進行求原碼、求反碼、求補碼這三步操作,最終將得到的機器數(shù)存入內(nèi)存。1、原碼原碼就是符號位加上真值的絕對值。例如,1的原碼為 0000 0001,-1的原碼為1000 0001。2、反碼反碼的表示方法是:正數(shù)的反碼是其原碼,負(fù)數(shù)的反碼是在其原碼的基礎(chǔ)上,符號位不變,其余各個位取反。例如1的原碼是0000 0001,反碼也是0000 0001,而-1的原碼是1000 0001,反碼則是1111 1110。3、補碼補碼的表示方法是:正數(shù)的補碼就其原碼,負(fù)數(shù)的補碼是在其反碼的基礎(chǔ)上+1。例如1的原碼是

14、0000 0001,反碼是0000 0001,補碼也是0000 0001,而-1的原碼是1000 0001,反碼是1111 1110,補碼則是1111 1111。最終一個數(shù)的補碼就是該數(shù)在計算機中以二進制形式存放的機器數(shù),例如數(shù)值1在計算機中的二進制形式為0000 0 01,而-1在計算機中的二進制形式為1111 1111。2.1.4 原碼、反碼、補碼的應(yīng)用通過前面的講解,我們了解了原碼、反碼和補碼,反碼與補碼的出現(xiàn)就是為了解決以下問題:l 使符號位能與有效值部分一起參加運算,從而簡化運算規(guī)則。 l 使減法運算轉(zhuǎn)換為加法運算,進一步簡化計算機中運算器的線路設(shè)計。接下來將通過兩個案例來詳細(xì)講解原

15、碼、反碼和補碼在計算機減法運算中的應(yīng)用。1、機器數(shù)轉(zhuǎn)換成真值假設(shè)長度為2個字節(jié)的內(nèi)存空間中存放著二進制數(shù)10010010 00111001,那么這塊內(nèi)存空間中存放的整數(shù)的數(shù)值是多少?因為計算機中用一個數(shù)的最高位存放符號,最高位為0表示是正數(shù),最高位為1表示是負(fù)數(shù),所以該整數(shù)是負(fù)數(shù)。推導(dǎo)過程如下所示:(1)因為負(fù)數(shù)在內(nèi)存中以補碼的形式存放,所以二進制數(shù)10010010 00111001是該負(fù)數(shù)的補碼;(2)因為負(fù)數(shù)的補碼是在其反碼的基礎(chǔ)上+1,所以該負(fù)數(shù)的補碼是二進制數(shù)10010010 00111000;(3)因為負(fù)數(shù)的反碼是在其原碼的基礎(chǔ)上,符號位不變,其余各個位取反,所以該負(fù)數(shù)的原碼是二進制

16、數(shù)11101101 11000111;(4)無視最高位的數(shù)值,二進制數(shù)01101101 11000111轉(zhuǎn)換成十進制數(shù)就是28103,再添加上符號,那么二進制數(shù)10010010 00111001的真值就是-28103。2、計算1-1的值計算機計算1-1的值的步驟具體如下:(1)將算式1-1轉(zhuǎn)換成算式1+(-1);(2)將算式中的數(shù)字轉(zhuǎn)換成原碼,算式就成為:0000 0001 + 1000 0001;(3)原碼轉(zhuǎn)換成反碼,算式就成為:0000 0001 + 1111 1110;(4)反碼轉(zhuǎn)換成補碼,算式就成為:0000 0001 + 1111 1111;(5)對補碼進行運算,得到結(jié)果:1 000

17、0 0000;(6)因為計算機使用8位二進制數(shù),所以結(jié)果的第9位被舍去,所以最終結(jié)果是:0000 0000;(7)由于0000 0000是十進制數(shù)0的補碼,所以計算機返回十進制數(shù)0。2.2 關(guān)鍵字和標(biāo)識符2.2.1 關(guān)鍵字所謂關(guān)鍵字是指在編程語言里事先定義好并賦予了特殊含義的單詞,也稱作保留字。關(guān)鍵字在程序中用于表示特殊含義,不能被隨便用作變量名、函數(shù)名等,在C語言中,C89標(biāo)準(zhǔn)中共定義了32個關(guān)鍵字,具體如下:auto double intstructbreakelselongswitchcaseenumregistertypedefcharexternreturn unionconstfl

18、oatshortunsignedcontinuesignedvoiddefaultgotosizeofvolatiledostaticwhileforif上面列舉的關(guān)鍵字中,每個關(guān)鍵字都有特殊的作用,例如,int關(guān)鍵字用于聲明一個整型的變量,sizeof關(guān)鍵字用于獲取指定類型數(shù)據(jù)的長度,char關(guān)鍵字用于聲明一個字符類型的變量。在本書后面的章節(jié)中將逐步對這些關(guān)鍵字進行講解,這里只需了解即可。2.2.2 標(biāo)識符在編程過程中,經(jīng)常需要定義一些符號來標(biāo)記一些名稱,如變量名、方法名、參數(shù)名、數(shù)組名等,這些符號被稱為標(biāo)識符。在C語言中標(biāo)識符的命名需要遵循一些規(guī)范,具體如下:l 標(biāo)識符只能由字母、數(shù)字和下

19、劃線組成。l 標(biāo)識符不能以數(shù)字作為第一個字符。l 標(biāo)識符不能使用關(guān)鍵字。l 標(biāo)識符區(qū)分大小寫字母,如add、Add和ADD是不同的標(biāo)識符。l 盡量做到“見名知意”,以增加程序的可讀性,如用age表示年齡,用length表示長度等。l 雖然ANSIC中沒有規(guī)定標(biāo)識符的長度,但建議標(biāo)識符的長度不超過8個字符。在上面的規(guī)范中,除了最后兩條外,其他的命名規(guī)范都是必須要遵守的,否則程序就會出錯。為了讓讀者對標(biāo)識符的命名規(guī)范有更深刻地理解,接下來列舉一些合法與不合法的標(biāo)識符,具體如下:下面是一些合法的標(biāo)識符:area DATE_namelesson_1 下面是一些不合法的標(biāo)識符:3a/ 標(biāo)識符不能以數(shù)字作

20、為第一個字符ab.c/ 標(biāo)識符只能由字母、數(shù)字和下劃線組成long/ 標(biāo)識符不能使用關(guān)鍵字abc#/ 標(biāo)識符只能由字母、數(shù)字和下劃線組成2.3 常量與變量2.3.1 常量的概念常量又稱常數(shù),是指在程序運行過程中其值不可改變的量。C語言中的常量可分為整型常量、實型常量、字符型常量、字符串常量和符號常量,下面將針對這些常量分別進行詳細(xì)講解。1、整型常量整型常量又稱為整數(shù)。C語言中,整數(shù)可用三種形式表示,具體如下:l 十進制整數(shù):十進制整數(shù)沒有前綴,其數(shù)碼為09,如123、-456、0;l 八進制整數(shù):八進制整數(shù)必須以數(shù)字0開頭,其數(shù)碼為07,如0123表示八進制整數(shù)123、-011表示八進制整數(shù)-

21、11;l 十六進制整數(shù):十六進制整數(shù)的前綴為0X或0x,其數(shù)碼為09、AF或af,如0x36C表示十六進制整數(shù)36C、-0x12d表示十六進制整數(shù)-12d。2、 實型常量實型也稱為浮點型,實型常量也稱為實數(shù)或浮點數(shù),也就是在數(shù)學(xué)中用到的小數(shù)。C語言中,實型常量采用十進制表示,它有兩種形式:十進制小數(shù)形式和指數(shù)形式,具體示例如下:l 十進制小數(shù)形式:由數(shù)字和小數(shù)點組成(注意:必須有小數(shù)點),如12.3、-45.6、1.0等;l 指數(shù)形式:又稱科學(xué)計數(shù)法,由于計算機輸入輸出時,無法表示上角或下角,所以規(guī)定以字母e或E表示以10為底的指數(shù),如12.34e3(代表12.34×103)、-34

22、.87e-2(代表34.87×10-2)、0.14E4(代表0.14×104)等。需要注意的是,“e”或“E”之前必須有數(shù)字,且“e”或“E”后面必須為整數(shù),如不能寫成e4、12e2.5等。3、字符常量有兩種形式的字符常量:l 普通字符:用單引號括起來的單個字符,如:'a'、'Z'、'3'、'?'、'#'。字符常量存儲在內(nèi)存中時,并不是存儲字符(如a、Z、#等)本身,而是以其ASCII碼存儲的,例如字符'a'的ASCII碼是97,因此在內(nèi)存中以二進制形式存放97。需要注意的是,單

23、引號只是界限符;字符常量只能是一個字符,不包括單引號,不能寫成'ab'或'12';字符常量是區(qū)分大小寫的,'a'和'A'是不同的字符常量。l 轉(zhuǎn)義字符:有些字符是無法用一般形式來表示的,我們可以用轉(zhuǎn)義字符來表示,就是以字符''開頭的字符序列,例如'n'表示一個換行符、't'表示一個制表符。常用轉(zhuǎn)義字符如表2-6所示。表2-6 轉(zhuǎn)義字符及其作用轉(zhuǎn)義字符對應(yīng)字符輸出結(jié)果'單引號(')輸出此字符"雙引號(")輸出此字符反斜線()輸出此字符a警告(aler

24、t)產(chǎn)生聲音或視覺信號b退格(backspace)將當(dāng)前位置后退一個字符f換頁(form feed)將當(dāng)前位置移到下一頁的開頭n換行將當(dāng)前位置移到下一行的開頭r回車(carriage return)將當(dāng)前位置移到本行的開頭t水平制表符將當(dāng)前位置移到下一個tab位置v垂直制表符將當(dāng)前位置移到下一個垂直制表對齊點d、dd、ddd13位八進制數(shù)表示的ASCII碼所代表的字符與該八進制ASCII碼對應(yīng)的字符xh、xhh12位十六進制數(shù)表示的ASCII碼所代表的字符與該十六進制ASCII碼對應(yīng)的字符表2-6中倒數(shù)第2行是一個八進制數(shù)表示的ASCII字符,例如'101'代表八進制數(shù)101的

25、ASCII字符,即十進制數(shù)65的ASCII字符'A';'012'代表八進制數(shù)12的ASCII字符,即十進制數(shù)10的ASCII字符'n'。表2-6中倒數(shù)第1行是一個十六進制數(shù)表示的ASCII字符,接下來,通過一個具體的,例來演示轉(zhuǎn)義符的用法,如例22e+23f例如'x41'代表十六進制數(shù)41的ASCII字符,也就是十進制65的ASCII字符'A';'x20'代表十六進制數(shù)20的ASCII字符,即十進制數(shù)32的ASCII字符:空格字符。這兩個方法可以表示任何可顯示的字母字符、數(shù)字字符、專用字符、圖形字符

26、和控制字符。計算機使用特定的整數(shù)編碼來表示對應(yīng)的字符。我們通常使用的英文字符編碼是 ASCII(American Standard Code for Information Interchange 美國信息交換標(biāo)準(zhǔn)編碼)。ASCII編碼是一個標(biāo)準(zhǔn),其內(nèi)容規(guī)定了把英文字母、數(shù)字、標(biāo)點、字符轉(zhuǎn)換成計算機能識別的二進制數(shù)的規(guī)則,并且得到了廣泛認(rèn)可和遵守。具體請參考附錄A中的ASCII碼表。l ASCII非打印控制字符:ASCII表上的數(shù)字0-31分配給了控制字符,用于控制像打印機等一些外圍設(shè)備(參詳ASCII碼表中0-31)。ASCII碼中9代表Tab鍵,10代表換行鍵,下面將用一個案例來

27、打印其效果,如例2-1所示。例2-1 1 #include <stdio.h> 2 void main() 3 4 printf("a%cbn", 9); 5 printf("c%cdn", 10); 6 運行結(jié)果如圖2-3所示。圖2-3 運行結(jié)果如圖2-3所示,a與b之間插入字符9,則a、b之間出現(xiàn)Tab制符表鍵的效果;c與d之間插入字符10,則c、d之間出現(xiàn)換行。l ASCII打印字符:數(shù)字32-126 分配給了能在鍵盤上找到的字符,當(dāng)查看或打印文檔時就會出現(xiàn)。數(shù)字127代表 DELETE 命令(參詳ASCII碼表中32-127)。4、字

28、符串常量字符串常量是用一對雙引號括起來的字符序列,例如"hello"、"123"、"itcast"等。字符串的長度等于字符串中包含的字符個數(shù),例如,字符串"hello"的長度為5個字符。字符串常量與字符常量是不同的,它們之間主要的區(qū)別有:l 字符型常量使用單引號定界,字符串常量使用雙引號定界。l 字符型常量只能是單個字符,字符串常量可以包含一個或多個字符。l 可以把一個字符型常量賦給一個字符型變量,但不能把一個字符串常量賦給一個字符串變量,C語言中沒有相應(yīng)的字符串變量,只能用字符數(shù)組存放字符串常量。5、符號常量C語

29、言中也可以用一個標(biāo)識符來表示一個常量,稱為符號常量。符號常量在使用前必須先定義,其語法格式如下所示:#define 標(biāo)識符 常量上述語法格式中,define是關(guān)鍵字,前面加符號“#”,表示這是一條預(yù)處理命令(預(yù)處理命令都以符號“#”開頭),稱為宏定義。例如將圓周率用PI表示,可寫成:#define PI 3.14該語句的功能是把標(biāo)識符“PI”定義為常量3.14,定義后在程序中所有出現(xiàn)標(biāo)識符“PI”的地方均用3.14代替PI。符號常量的標(biāo)識符是用戶自己定義的。符號常量有以下特點:l 習(xí)慣上符號常量的標(biāo)識符用大寫字母,變量標(biāo)識符用小寫字母,以示區(qū)別。l 符號常量與變量不同,符號常量的值在其作用域內(nèi)

30、不能改變,也不能再被賦值。l 使用符號常量的好處是:含義清楚,并且能做到“一改全改”。2.3.2 變量的定義在程序運行期間,隨時可能產(chǎn)生一些臨時數(shù)據(jù),應(yīng)用程序會將這些數(shù)據(jù)保存在一些內(nèi)存單元中,每個內(nèi)存單元都用一個標(biāo)識符來標(biāo)識。這些內(nèi)存單元我們稱之為變量,定義的標(biāo)識符就是變量名,內(nèi)存單元中存儲的數(shù)據(jù)就是變量的值。接下來,通過一段代碼來學(xué)習(xí)變量的定義,具體如下:int x = 0, y;y = x+3;上面的代碼中,第一行代碼的作用是定義了兩個變量x和y,也就相當(dāng)于分配了兩塊內(nèi)存單元,在定義變量的同時為變量x分配了一個初始值0,而變量y沒有分配初始值,變量x和y在內(nèi)存中的狀態(tài)如圖2-4所示。圖2-

31、4 x、y變量在內(nèi)存中的狀態(tài)第二行代碼的作用是為變量賦值,在執(zhí)行第二行代碼時,程序首先取出變量x的值,與3相加后,將結(jié)果賦值給變量y,此時變量x和y在內(nèi)存中的狀態(tài)發(fā)生了變化,如圖2-5所示。圖2-5 x、y變量在內(nèi)存中的狀態(tài)從圖2-4、圖2-5以及上面的描述不難發(fā)現(xiàn),變量實際上就是一個臨時存放數(shù)據(jù)的地方。在程序中,可以將指定的數(shù)據(jù)存放到變量中,方便隨時取出來再次進行使用。變量對于一段程序的運行是至關(guān)重要的,讀者在后續(xù)的學(xué)習(xí)中會逐步地了解變量的作用。2.3.3 變量的數(shù)據(jù)類型在應(yīng)用程序中,由于數(shù)據(jù)存儲時所需要的容量各不相同,因此,為了區(qū)分不同的數(shù)據(jù),需要將數(shù)據(jù)劃分為不同的數(shù)據(jù)類型。C語言中的數(shù)據(jù)

32、類型有很多種,具體如圖2-6所示。圖2-6 C語言的數(shù)據(jù)類型從圖2-6中可以看出,C語言中的數(shù)據(jù)類型可分為4種,分別是基本類型、構(gòu)造類型、指針類型、空類型。接下來將針對基本數(shù)據(jù)類型進行詳細(xì)地講解,關(guān)于其他數(shù)據(jù)類型將在后面章節(jié)中講解。1、整型變量在程序開發(fā)中,經(jīng)常會遇到0、-100、1024等數(shù)字,這些數(shù)字都可稱為整型。整型就是一個不包含小數(shù)部分的數(shù)。在C語言中,根據(jù)數(shù)值的取值范圍,可以將整型定義為短整型(short int)、基本整型(int)和長整型(long int)。表2-7中列舉了整數(shù)類型的長度及其取值范圍。表2-7 整數(shù)類型的長度及其取值范圍修飾符數(shù)據(jù)類型占用空間取值范圍signed

33、short int16位(2個字節(jié))-32768到32767 (-215 215-1)int32位(4個字節(jié))-2147483648到2147483647 (-231 231-1)long int32位(4個字節(jié))-2147483648到2147483647 (-231 231-1)unsignedshort int16位(2個字節(jié))0到65535 (0 216-1)int32位(4個字節(jié))0到4294967295 (0 232-1)long int32位(4個字節(jié))0到4294967295 (0 232-1)從表2-7中可以看出,整數(shù)類型可分為short、int和long,這三種類型可以被s

34、igned和unsigned修飾。其中,被signed修飾的整數(shù)類型稱為有符號的整數(shù)類型,被unsigned修飾的稱為無符號的整數(shù)類型。它們之間最大的區(qū)別是無符號類型可以存放的正數(shù)范圍比有符號類型中的范圍大一倍,例如,int的取值范圍是-231231-1,而unsigned int的取值范圍是0232-1。默認(rèn)情況下,整型數(shù)據(jù)都是有符號的,此時signed修飾符可以不用寫。需要注意的是,整型數(shù)據(jù)在內(nèi)存中占的字節(jié)數(shù)與所選擇的操作系統(tǒng)有關(guān)。雖然C語言標(biāo)準(zhǔn)中沒有明確規(guī)定整型數(shù)據(jù)的長度,但long類型整數(shù)的長度不能短于int類型,int類型整數(shù)的長度不能短于short類型。通過對表2-7的學(xué)習(xí),我們了

35、解了不同整數(shù)類型數(shù)據(jù)的取值范圍,這些數(shù)據(jù)類型的極值在頭文件stdlib.h中都有宏定義,可以將它們打印出來,如例2-2所示。例2-2 1 #include <stdio.h> 2 #include <stdlib.h> 3 void main() 4 5 printf("short:%d%dn",SHRT_MIN,SHRT_MAX); 6 printf("int:%d%dn", INT_MIN,INT_MAX); 7 printf("long:%d%dn", LONG_MIN, LONG_MAX); 8 pri

36、ntf("unsigned short:%un", USHRT_MAX); / %u是無符號整數(shù)輸出格式 9 printf("unsigned int:%un", UINT_MAX); 10 printf("unsigned long:%un", ULONG_MAX); 11 system("pause"); 12 運行結(jié)果如圖2-7所示。圖2-7 運行結(jié)果在圖2-7中可以看出,將short、int、long的有符號與無符號極值都打印出來,與表2-6的一致。關(guān)于宏定義的相關(guān)知識,將在第8章詳細(xì)講解,這里同學(xué)們只需了

37、解這些不同的宏定義對應(yīng)著不同數(shù)據(jù)類型的極值即可。&多學(xué)一招:計算機的數(shù)據(jù)單位位(bit):電子計算機中最小的數(shù)據(jù)單位,每一位的狀態(tài)只能是0或1。字節(jié)(byte):8個二進制位構(gòu)成1個字節(jié),它是存儲空間的基本計量單位。1個字節(jié)可以儲存1個英文字母或者半個漢字,換句話說,1個漢字占據(jù)2個字節(jié)的存儲空間。KB:在一般的計量單位中,通常K表示1000,例如:1公里=1000米,經(jīng)常被寫為1km;1公斤=1000克,寫為1kg。同樣K在二進制中也有類似的含義,只是這時K表示1024,也就是2的10次方。1KB表示1K個Byte,也就是1024個字節(jié)。MB:計量單位中的M(兆)是10的6次方,見到

38、M自然想起要在該數(shù)值的后邊續(xù)上六個0,即擴大一百萬倍。在二進制中,MB也表示到了百萬級的數(shù)量級,但1MB不正好等于1000000字節(jié),而是1048576字節(jié),即 1MB = 2E+20 Bytes = 1048576Bytes,也就是1024KB。GB:比MB更大的單位,1GB=1024MB=220KB=230B。TB:比GB更大的單位,1TB=1024GB。2、實型變量實型變量也可以稱為浮點型變量,浮點型變量是用來存儲小數(shù)數(shù)值的。在C語言中,浮點型變量分為兩種:單精度浮點數(shù)(float)、雙精度浮點數(shù)(double),但是double型變量所表示的浮點數(shù)比float型變量更精確。表2-8列舉

39、了兩種不同浮點型數(shù)所占用的存儲空間大小及取值范圍。表2-8 浮點類型長度及其取值范圍類型名占用空間 取值范圍float32位(4個字節(jié))1.4E-45 3.4E+38,-1.4E-45 -3.4E+38double64位(8個字節(jié))4.9E-324 1.7E+308, -4.9E-324 -1.7E+308表2-8中列出了兩種浮點數(shù)類型變量所占的空間大小和取值范圍。在取值范圍中,E表示以10為底的指數(shù),E后面的“+”號和“-”號代表正指數(shù)和負(fù)指數(shù),例如,1.4E-45表示1.4*10-45。為了讓讀者更好地理解浮點型數(shù)據(jù)在內(nèi)存中的存儲方式,接下來以單精度浮點數(shù)3.14159為例進行詳細(xì)講解,如

40、圖2-8所示。圖2-8 單精度浮點數(shù)存儲方式在圖2-8中,浮點數(shù)包含符號位、小數(shù)位和指數(shù)位三部分,例如,小數(shù)3.14159在內(nèi)存中的符號位為“+”,小數(shù)部分為.314159,指數(shù)位為1,連接在一起即為“+0.314159 * 101 = 3.14159”。在C語言中,一個小數(shù)會被默認(rèn)為double類型的值,在為一個float類型變量賦值時可以在后面加上字母“F”(或者小寫“f”),double類型變量后加上“D”(或者小寫“d”)來加以區(qū)分。但C語言在為變量賦值時可以自動轉(zhuǎn)換類型,所以后綴可以省略,具體示例如下:float f = 123.4f;/ 為一個float類型的變量賦值,后面可以加上

41、字母fdouble d2 = 199.3d;/ 為一個double類型的變量賦值,后面可以加上字母d另外,在程序中也可以為一個浮點數(shù)類型變量賦予一個整數(shù)數(shù)值,示例如下:float f = 100;/ 聲明一個float類型的變量并賦整數(shù)值double d = 100;/ 聲明一個double類型的變量并賦整數(shù)值M腳下留心:float和double精確度由于浮點型變量是由有限的存儲單元組成的,因此只能提供有限的有效數(shù)字。在有效位以外的數(shù)字將不精確。雙精度浮點數(shù)的有效位數(shù)更多,比單精度浮點數(shù)更能精確表達數(shù)據(jù),它能提供15-16位有效位數(shù),而單精度浮點數(shù)只能提供6-7位有效位數(shù)。例如,將1.1234

42、5678910111213賦給一個float型變量和dobule類型變量,其有效位數(shù)不同。如例2-3所示。例2-3 1 #include <stdio.h> 2 void main() 3 4 float f = 1.12345678910111213; 5 double d = 1.12345678910111213; 6 printf("f = %.17fnd = %.17fn", f, d); / %.17f是打印到小數(shù)點后17位 7 運行結(jié)果如圖2-9所示。圖2-9 運行結(jié)果從圖2-9中可以看出,float類型的f變量精確到小數(shù)點后6位,double類型

43、的d精確到小數(shù)點后15位,其后的數(shù)進行了四舍五入。3、字符型變量字符型變量用于存儲一個單一字符,在C語言中用char表示,其中每個字符變量都會占用1個字節(jié)。在給字符型變量賦值時,需要用一對英文半角格式的單引號(' ')把字符括起來,例如,'A'的聲明方式如下所示:char ch = 'A'/ 為一個char類型的變量賦值字符'a'上述代碼中,將字符常量“A”放到字符變量ch中,實際上并不是把該字符本身放到變量的內(nèi)存單元中去,而是將該字符對應(yīng)的ASCII編碼放到變量的存儲單元中,例如:ASCII 使用編號 65&

44、#160;來對應(yīng)大寫字母“A”,因此變量ch存儲的是整數(shù)65,而不是字母“A”本身。接下來通過一個案例來說明字符變量如何存放字符常量,如例2-4所示。例2-4 1 #include <stdio.h> 2 void main() 3 4 char ch1 = 'A' 5 char ch2 = 65; 6 printf("%cn", ch1); 7 printf("%cn", ch2); 8 運行結(jié)果如圖2-10所示。圖2-10 ASCII字符例2-4中,定義了兩個char類型變量,分別賦值為字符“A”和數(shù)字65,然后通過pri

45、ntf()函數(shù)把兩個變量的內(nèi)容以字符形式打印到屏幕上。從圖2-10中可以看出,兩個變量輸出的結(jié)果是一樣的,這說明對于字符型來說,A和65其實沒什么區(qū)別。嚴(yán)格來說,字符類型也是整型類型。需要注意的是,除了可以直接從鍵盤上輸入的字符(如英文字母,標(biāo)點符號,數(shù)字,數(shù)學(xué)運算符等)以外,還有一些字符是無法用鍵盤直接輸入的,比如,“回車”,此時需要采用一種新的定義方式轉(zhuǎn)義字符,它以反斜杠()開頭,隨后接特定的字符。接下來,通過一個具體的案例來演示轉(zhuǎn)義符的用法,如例2-5所示。例2-5 1 #include <stdio.h> 2 void main() 3 4 char ch1 = '

46、A' 5 char ch2 = 'n' 6 char ch3 = 'B' 7 char ch4 = '' 8 printf("%c", ch1); 9 printf("%c", ch2); 10 printf("%c", ch3); 11 printf("%c", ch4); 12 printf("n"); 13 運行結(jié)果如圖2-11所示。圖2-11 ASCII字符的輸出結(jié)果在例2-5中定義了四個字符型變量,其中ch2被賦值為轉(zhuǎn)義字符“n”

47、即換行符,ch4被賦值為轉(zhuǎn)義字符“”即反斜杠。從第8行到第11行按照順序分別將五個變量的值輸出到屏幕上,我們會發(fā)現(xiàn)輸出字符A之后另起一行輸出字符B,轉(zhuǎn)義字符“n”的作用就是控制輸出結(jié)果另起一行;字符B后輸出的是字符“”。第12行為了使輸出結(jié)果的格式清晰一些又輸出了一個換行符,防止程序結(jié)束后命令行提示符緊跟在輸出結(jié)果的后面。4、枚舉類型變量在日常生活中有許多對象的值是有限的,可以一一列舉出來。例如一個星期內(nèi)只有七天、一年只有十二個月等等。如果把這些量說明為整型,字符型或其它類型顯然是不妥當(dāng)?shù)?。為此,C語言提供了一種稱為“枚舉”的類型。枚舉類型就是其值可以被一一列舉出來,并且變量的取值不能超過定義

48、的范圍。枚舉類型的聲明方式比較特殊,具體格式如下:enum 枚舉名 標(biāo)識符1 = 整型常量1, 標(biāo)識符2 = 整型常量2, .;在上述代碼中,enum表示聲明枚舉的關(guān)鍵字,枚舉名表示枚舉對象的名稱。為了讓讀者更好的理解枚舉類型的使用,接下來通過定義一個枚舉類型來進行詳細(xì)講解。示例如下:enum month JAN=1, FEB=2, MAR=3, APR=4, MAY=5, JUN=6, JUL=7, AUG=8, SEP=9, OCT=10, NOV=11, DEC=12 ;上面的代碼中,聲明了一個枚舉類型對象month,然后就可以使用此類型來定義變量。接下來,通過一個具體案例來學(xué)習(xí)枚舉的具

49、體用法,如例 2-6 所示。例2-6 1 #include <stdio.h> 2 enum month JAN=1, FEB=2, MAR=3, APR=4, MAY=5, JUN=6, 3 JUL=7, AUG=8, SEP=9, OCT=10, NOV=11, DEC=12; 4 void main() 5 6 enum month lastmonth, thismonth, nextmonth; 7 lastmonth = APR; 8 thismonth = MAY; 9 nextmonth = JUN; 10 printf("%d %d %d n",

50、 lastmonth, thismonth, nextmonth); 11 運行結(jié)果如圖2-12所示。圖2-12 運行結(jié)果在例2-6中,第2行代碼定義了一個枚舉類型,其中,枚舉名month是一個標(biāo)識符,大括號中的內(nèi)容被稱為枚舉值表;枚舉值表內(nèi)的標(biāo)識符JAN、FEB、MAR等被稱作枚舉元素,枚舉元素是被命名的整型常量,枚舉值表中羅列出所有可用值,枚舉成員對應(yīng)的值是枚舉值,枚舉類型的定義以分號結(jié)束。第6行定義了三個枚舉變量,在后面的代碼中分別進行了賦值,最后依次將這三個枚舉變量的值輸出到顯示器??梢钥闯鲚敵鼋Y(jié)果為枚舉元素對應(yīng)的值。需要注意的是,枚舉值是常量,不是變量,在程序中不能賦值。例如在主函數(shù)

51、中,對MAR再次賦值是錯誤的。&多學(xué)一招:枚舉變量的快速定義在枚舉中規(guī)定,如果不給標(biāo)識符指定具體的值,會默認(rèn)該標(biāo)識符的值等于前一標(biāo)識符的值加1。因此可以將上面的定義簡化成:enum monthJAN=1, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC;如果不指定第一個標(biāo)識符對應(yīng)的常量,則它的默認(rèn)值是0,如例2-7所示。例2-7 1 #include <stdio.h> 2 / 定義一組常量 3 enum Constants C1, C2, C3 = 4, C4, C5 = 3, C6, C7, C8 = '

52、;0', C9; 4 void main() 5 6 printf("C1=%dn", C1); 7 運行結(jié)果如圖2-13所示。圖2-13 運行結(jié)果在例2-7中,首先用枚舉定義了一組常量C1到C9,并向顯示器輸出常量C1的數(shù)值。作為讀者,在編譯和運行該例程之前,最好先試著猜測C1到C9這九個常量的數(shù)值。2.3.4 數(shù)據(jù)類型的轉(zhuǎn)換在C語言程序中,經(jīng)常需要對不同類型的數(shù)據(jù)進行運算,為了解決數(shù)據(jù)類型不一致的問題,需要對數(shù)據(jù)的類型進行轉(zhuǎn)換。例如一個浮點數(shù)和一個整數(shù)相加,必須先將兩個數(shù)轉(zhuǎn)換成同一類型。C語言程序中的類型轉(zhuǎn)換可分為隱式和強制類型轉(zhuǎn)換兩種,具體如下:1、隱式類型轉(zhuǎn)

53、換隱式類型轉(zhuǎn)換又稱為自動類型轉(zhuǎn)換,隱式類型轉(zhuǎn)換可分為三種:算術(shù)轉(zhuǎn)換、賦值轉(zhuǎn)換和輸出轉(zhuǎn)換。(1)算術(shù)轉(zhuǎn)換:進行算術(shù)運算(加、減、乘、除、取余以及符號運算)時,不同類型數(shù)招必須轉(zhuǎn)換成同一類型的數(shù)據(jù)才能運算。算術(shù)轉(zhuǎn)換原則為: 對于所有比int小的類型,包括char、unsigned char、short、unsigned short,首先會提升為int類型。 在進行運算時,以表達式中最長類型為主,將其他類型位據(jù)均轉(zhuǎn)換成該類型,如:l 若運算數(shù)中有double型或float型,則其他類型數(shù)據(jù)均轉(zhuǎn)換成double類型進行運算。l 若運算數(shù)中最長的類型為long型則其他類型數(shù)均轉(zhuǎn)換成long型數(shù)。l 若運

54、算數(shù)中最長類型為int型,則char型也轉(zhuǎn)換成int型進行運算。特別注意的是有符號和無符號之間的轉(zhuǎn)換:long與unsigned int在32位機器上都是4字節(jié),所以均轉(zhuǎn)換為unsigned long。signed與unsigned int,signed會轉(zhuǎn)換為unsigned。如果int恰好為負(fù)數(shù),其結(jié)果為對unsigned取值求模的結(jié)果。比如將-1賦給8位的unsigned char,那么結(jié)果就是255(-1對256取模后的值)。unsigned char取值范圍0255。(2)賦值轉(zhuǎn)換:進行賦值操作時,賦值運算符右邊的數(shù)據(jù)類型必須轉(zhuǎn)換成賦值號左邊的類型,若右邊的數(shù)據(jù)類型的長度大于左邊,則

55、要進行截斷或舍入操作。下面用實例進行說明:char ch;int i, result;float f;double d;result=ch/i+(f*d-i); 首先計算“ch/i”,因為變量i是int型,所以變量ch轉(zhuǎn)換為int型,“ch/i”返回int型結(jié)果。 接著計算“f*d-i”,由于最長型為double型(變量d),故變量f轉(zhuǎn)換為double型,變量i轉(zhuǎn)換為double型,“f*d-i”的結(jié)果也轉(zhuǎn)換為double型。 “ch/i”和“f*d-i”進行加運算,由于“f*d-i”的返回值為double型,故“ch/i”的返回值也轉(zhuǎn)換為double型,“ch/i+(f*d-i)”的返回值是

56、double型。 由于result為int型,故“ch/i+(f*d-i)”的返回值由double型轉(zhuǎn)換為int型,即進行截斷與舍入,最后取值為整型。(3)輸出轉(zhuǎn)換:在程序中將數(shù)據(jù)用printf()函數(shù)以指定格式輸出時,當(dāng)要輸出的數(shù)據(jù)類型與輸出格式不符時,便自動進行類型轉(zhuǎn)換,如一個整(int)型數(shù)據(jù)用字符(char)型格式(%c)輸出時,相當(dāng)于將int型轉(zhuǎn)換成char型數(shù)據(jù)輸出;一個字符(char)型數(shù)據(jù)用整(int)型格式輸出時,相當(dāng)于將char型轉(zhuǎn)換成int型輸出。需要注意的是,較長型數(shù)據(jù)轉(zhuǎn)換成短型數(shù)據(jù)輸出時,其值不能超出短型數(shù)據(jù)允許的值范圍,否則轉(zhuǎn)換時將出錯,例如:int a=321;printf("%c",a);運行結(jié)果為“A”,因為char型允許的最大值為255,321超出此值,故結(jié)果取以256為模的余數(shù),即進行取余運算:321%2

溫馨提示

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

最新文檔

評論

0/150

提交評論