版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、博學(xué)谷讓IT教學(xué)更簡單,讓IT學(xué)習(xí)更有效第2章 數(shù)據(jù)類型與運(yùn)算符學(xué)習(xí)目標(biāo)u 理解進(jìn)制和進(jìn)制轉(zhuǎn)換u 牢記C語言中的關(guān)鍵字和標(biāo)識(shí)符定義規(guī)則u 掌握不同數(shù)據(jù)類型間的轉(zhuǎn)換u 學(xué)會(huì)使用運(yùn)算符進(jìn)行運(yùn)用通過上一章的學(xué)習(xí),相信大家對(duì)C語言已經(jīng)有了一個(gè)初步認(rèn)知。接下來的第2章將針對(duì)C語言開發(fā)中必須要掌握的進(jìn)制、常量、變量、運(yùn)算符等基礎(chǔ)知識(shí)進(jìn)行講解。2.1 數(shù)據(jù)存儲(chǔ)的原理 2.1.1 進(jìn)制進(jìn)制是一種計(jì)數(shù)機(jī)制,它可以使用有限的數(shù)字符號(hào)代表所有的數(shù)值。對(duì)于任何一種進(jìn)制X進(jìn)制,就表示某一位置上的數(shù)在運(yùn)算時(shí)逢X進(jìn)一位。實(shí)際生活中也有很多進(jìn)制的應(yīng)用場景,例如時(shí)間每過60秒,分鐘就會(huì)加1,這就是六十進(jìn)制。再比如對(duì)學(xué)生進(jìn)行分組
2、時(shí),假設(shè)8人一組,可以讓學(xué)生進(jìn)行報(bào)數(shù),報(bào)滿8個(gè)數(shù)就多了一個(gè)小組,這就是八進(jìn)制。接下來將針對(duì)C語言中的二進(jìn)制、八進(jìn)制和十六進(jìn)制分別進(jìn)行講解。1、二進(jìn)制在絕大多數(shù)計(jì)算機(jī)系統(tǒng)中,數(shù)據(jù)都是通過二進(jìn)制的形式存在的。二進(jìn)制是計(jì)算技術(shù)中廣泛采用的一種數(shù)制。二進(jìn)制數(shù)據(jù)是用0和1兩個(gè)符號(hào)來表示的數(shù)。它的基數(shù)為2,進(jìn)位規(guī)則是“逢二進(jìn)一”。例如計(jì)算二進(jìn)制算術(shù)“1+1”,因?yàn)閭€(gè)位數(shù)1是該位上最大的數(shù),所以再加1后就會(huì)向十位進(jìn)一,個(gè)位改為0,所以二進(jìn)制算術(shù)“1+1”的結(jié)果是二進(jìn)制數(shù)10。為了幫助大家更好地理解二進(jìn)制,接下來通過二進(jìn)制和十進(jìn)制的對(duì)比來描述二進(jìn)制的表示方式,如表2-1所示。表2-1 十進(jìn)制與二進(jìn)制對(duì)照表十進(jìn)
3、制二進(jìn)制十進(jìn)制二進(jìn)制00000501011000160110200107011130011810004010091001從表2-1可以看出,當(dāng)用二進(jìn)制表示十進(jìn)制數(shù)字2時(shí),由于二進(jìn)制的符號(hào)只有0和1,所以根據(jù)“逢二進(jìn)一”的規(guī)則,需要向高位進(jìn)一位,表示為0010。同理,使用二進(jìn)制表示十進(jìn)制數(shù)字4時(shí),繼續(xù)向高位進(jìn)一位,表示為0100。需要注意的是,十進(jìn)制和二進(jìn)制只是針對(duì)數(shù)字的不同表示方式,無論采用哪種方式表示一個(gè)數(shù),它的值都是一樣的。以十進(jìn)制數(shù)7為例,十進(jìn)制由符號(hào)“7”組成 ,而二進(jìn)制由符號(hào) “0”、“1”、“1”和“1”組成。2、八進(jìn)制八進(jìn)制是一種“逢八進(jìn)一”的進(jìn)制,它由07這八個(gè)符號(hào)來描述。同樣
4、地,此處通過十進(jìn)制和八進(jìn)制的對(duì)比來描述八進(jìn)制的表示方式,如表2-2所示。表2-2 十進(jìn)制與八進(jìn)制對(duì)照表十進(jìn)制八進(jìn)制十進(jìn)制八進(jìn)制009111110122211133312144413155514166615177716208101721從表2-2中可以看出,當(dāng)使用八進(jìn)制表示十進(jìn)制數(shù)字8時(shí),由于表示八進(jìn)制的符號(hào)只有07,因此,根據(jù)逢八進(jìn)一的規(guī)則,需要向高位進(jìn)一位,表示為10。同理,使用八進(jìn)制表示十進(jìn)制數(shù)字16時(shí),繼續(xù)向高位進(jìn)一位,表示為20。3、十六進(jìn)制十六進(jìn)制是一種“逢十六進(jìn)一”的進(jìn)制,它由09、AF這十六個(gè)符號(hào)來描述。下面通過十進(jìn)制和十六進(jìn)制的對(duì)比來描述十六進(jìn)制的表示方式,如表2-3所示。表2
5、-3 十進(jìn)制與十六進(jìn)制對(duì)照表十進(jìn)制十六進(jìn)制十進(jìn)制十六進(jìn)制00171111181222191333201444211555221666231777241888251999261A10A271B11B281C12C291D13D301E14E311F15F322016103321從表2-3中可以看出,當(dāng)使用十六進(jìn)制表示十進(jìn)制數(shù)字16時(shí),由于表示十六進(jìn)制的符號(hào)只有09、AF,因此,根據(jù)逢“逢十六進(jìn)一”的規(guī)則,需要向高位進(jìn)一位,表示為10。同理,使用十六進(jìn)制表示十進(jìn)制數(shù)字32時(shí),繼續(xù)向高位進(jìn)一位,表示為20。2.1.2 進(jìn)制轉(zhuǎn)換通過前面內(nèi)容的學(xué)習(xí),讀者應(yīng)該知道在計(jì)算機(jī)中一個(gè)數(shù)值可以用不同的進(jìn)制形式來表
6、示,但實(shí)際上,不管是哪種進(jìn)制形式來表示,數(shù)值本身是不會(huì)發(fā)生變化的。因此,各種進(jìn)制之間可以輕松地實(shí)現(xiàn)轉(zhuǎn)換,下面就以十進(jìn)制、二進(jìn)制、八進(jìn)制、十六進(jìn)制為例來講解如何實(shí)現(xiàn)進(jìn)制轉(zhuǎn)換。一、十進(jìn)制與二進(jìn)制之間的轉(zhuǎn)換十進(jìn)制與二進(jìn)制之間的轉(zhuǎn)換是最常見也是必須掌握的一種進(jìn)制轉(zhuǎn)換方式,下面針對(duì)十進(jìn)制轉(zhuǎn)二進(jìn)制和二進(jìn)制轉(zhuǎn)十進(jìn)制的方式分別進(jìn)行講解。1、十進(jìn)制轉(zhuǎn)二進(jìn)制十進(jìn)制轉(zhuǎn)換成二進(jìn)制可以采用除2取余的方式。也就是說將要轉(zhuǎn)換的數(shù),先除以2,獲得商和余數(shù),將商繼續(xù)除以2,獲得商和余數(shù),此過程一直重復(fù)直到商為0。最后將所有得到的余數(shù)倒序排列,即可得到轉(zhuǎn)換結(jié)果。接下來就以十進(jìn)制的6轉(zhuǎn)換為二進(jìn)制為例進(jìn)行說明,其演算過程如圖2-1所
7、示。圖2-1 十進(jìn)制轉(zhuǎn)二進(jìn)制從圖2-1中可以看出,十進(jìn)制的6連續(xù)三次除以2后,得到的余數(shù)依次是:0、1、1。將所有余數(shù)倒序排列后為110,因此,十進(jìn)制的6轉(zhuǎn)換成二進(jìn)制后的結(jié)果是110。2、二進(jìn)制轉(zhuǎn)十進(jìn)制二進(jìn)制轉(zhuǎn)化成十進(jìn)制要從右到左用二進(jìn)制位上的每個(gè)數(shù)去乘以2的相應(yīng)次方,例如,將最右邊第一位的數(shù)乘以2的0次方,第二位的數(shù)乘以2的1次方,第n位的數(shù)乘以2的n-1次方,然后把所有乘的結(jié)果相加,得到的結(jié)果就是轉(zhuǎn)換后的十進(jìn)制。例如,把一個(gè)二進(jìn)制數(shù)0110 0100轉(zhuǎn)換為10進(jìn)制,轉(zhuǎn)換方式如下:0 * 20 + 0 * 21 + 1 * 22 + 0 * 23 + 0 * 24 + 1 * 25 + 1
8、* 26+ 0 * 27 = 100由于0乘以多少都是0,所以上述表達(dá)式也可以簡寫為:1 * 22 + 1 * 25 + 1 * 26 = 100得到的結(jié)果100就是二進(jìn)制數(shù)0110 0100轉(zhuǎn)化后的十進(jìn)制表現(xiàn)形式。二、八進(jìn)制與二進(jìn)制之間的轉(zhuǎn)換該類轉(zhuǎn)換通常是二進(jìn)制轉(zhuǎn)換成八進(jìn)制,在轉(zhuǎn)換的過程中有一個(gè)技巧,就是將二進(jìn)制數(shù)自右向左每三位分成一段(若不足三位,左邊用0補(bǔ)齊),然后將二進(jìn)制每段的三位轉(zhuǎn)為八進(jìn)制的一位,轉(zhuǎn)換過程中數(shù)值的對(duì)應(yīng)關(guān)系如表2-4所示。表2-4 二進(jìn)制和八進(jìn)制數(shù)值對(duì)應(yīng)表二進(jìn)制八進(jìn)制00000011010201131004101511061117接下來,就以將二進(jìn)制數(shù)00101010為
9、例來演示如何轉(zhuǎn)為八進(jìn)制,具體演算過程如下:(1)每三位分成一段,結(jié)果為:000 101 010;(2)將每段的數(shù)值分別查表替換,結(jié)果如下:010 à 2101 à 5000 à 0(3)將替換的結(jié)果進(jìn)行組合,組合后的八進(jìn)制為0052(注意八進(jìn)制必須以0開頭)。八進(jìn)制轉(zhuǎn)換成二進(jìn)制的過程正好相反,只需將八進(jìn)制數(shù)中每一位數(shù)轉(zhuǎn)換成對(duì)應(yīng)的三位二進(jìn)制數(shù)即可。三、十六進(jìn)制與二進(jìn)制之間的轉(zhuǎn)換將二進(jìn)制轉(zhuǎn)十六進(jìn)制時(shí),與轉(zhuǎn)八進(jìn)制類似,不同的是要將二進(jìn)制數(shù)每四位分成一段(若不足4位用0補(bǔ)齊),查表轉(zhuǎn)換即可。二進(jìn)制轉(zhuǎn)十六進(jìn)制過程中數(shù)值的對(duì)應(yīng)關(guān)系如表2-5所示。表2-5 二進(jìn)制和十六進(jìn)制數(shù)值
10、對(duì)應(yīng)表二進(jìn)制十六進(jìn)制二進(jìn)制十六進(jìn)制00000100080001110019001021010A001131011B010041100C010151101D011061110E011171111F接下來,二進(jìn)制數(shù)01010110轉(zhuǎn)為十六進(jìn)制,具體步驟如下:(1)每四位分成一段,結(jié)果為:0101 0110;(2)將每段的數(shù)值分別查表替換,結(jié)果如下:0110 à 60101 à 5(3)將替換的結(jié)果進(jìn)行組合,轉(zhuǎn)換的結(jié)果為:0x56或0X56(注意十六進(jìn)制必須以0x或者0X開頭)。上述講解了二進(jìn)制與其他進(jìn)制的轉(zhuǎn)換,除二進(jìn)制外,其他進(jìn)制之間的轉(zhuǎn)換也很簡單,只需將它們轉(zhuǎn)換成二進(jìn)制數(shù),然
11、后將二進(jìn)制轉(zhuǎn)為其他進(jìn)制即可。&多學(xué)一招:小數(shù)的二進(jìn)制十進(jìn)制小數(shù)轉(zhuǎn)換為二進(jìn)制采用“乘2取整”規(guī)則。方法是用2乘以十進(jìn)制小數(shù)部分,將其結(jié)果的整數(shù)部分去掉,用2乘以余下的小數(shù)部分,再去掉其結(jié)果的整數(shù)部分;如此繼續(xù)下去,直到余下的小數(shù)部分為0或滿足所要求的精度為準(zhǔn)。最后將每次得到的整數(shù)部分(0或1)按先后順序從前至后排列,即為小數(shù)對(duì)應(yīng)的二進(jìn)制。例如:將小數(shù)0.8125轉(zhuǎn)換為二進(jìn)制,轉(zhuǎn)換過程如圖2-2所示。圖2-2 十進(jìn)制小數(shù)轉(zhuǎn)換為二進(jìn)制 由圖2-2所示十進(jìn)制0.8125連續(xù)4次乘以2使得小數(shù)部分為0,所得整數(shù)依次為1、1、0、1,所以轉(zhuǎn)換后結(jié)果為0.1101。 需要注意的是,有些十進(jìn)制小數(shù)不一
12、定能完全精確的轉(zhuǎn)換為二進(jìn)制,可以根據(jù)精度要求轉(zhuǎn)換到小數(shù)點(diǎn)后某一位為止。2.1.3 原碼、反碼、補(bǔ)碼一個(gè)數(shù)在計(jì)算機(jī)中的二進(jìn)制存儲(chǔ)形式,叫做這個(gè)數(shù)的機(jī)器數(shù)。機(jī)器數(shù)是帶符號(hào)的,在計(jì)算機(jī)中用一個(gè)數(shù)的最高位存放符號(hào),最高位為0表示是正數(shù),最高位為1表示是負(fù)數(shù)。比如十進(jìn)制數(shù)3的機(jī)器數(shù)是0000 0011;如果是-3,它的機(jī)器數(shù)就是1000 0011。帶符號(hào)位的機(jī)器數(shù)對(duì)應(yīng)的真正數(shù)值稱為機(jī)器數(shù)的真值。例如,0000 0011的真值是3,1000 0011的真值是-3。需要注意的是,機(jī)器數(shù)的真值和機(jī)器數(shù)轉(zhuǎn)換成十進(jìn)制數(shù)是不一樣的,例如1000 0011轉(zhuǎn)換成十進(jìn)制數(shù)是131,但由于機(jī)器數(shù)的最高位存放符號(hào),因此機(jī)器
13、數(shù)的真值是-3。機(jī)器數(shù)有原碼、補(bǔ)碼、反碼這三種表現(xiàn)形式。計(jì)算機(jī)將一個(gè)數(shù)以二進(jìn)制形式存儲(chǔ)時(shí),會(huì)將該數(shù)分別進(jìn)行求原碼、求反碼、求補(bǔ)碼這三步操作,最終將得到的機(jī)器數(shù)存入內(nèi)存。1、原碼原碼就是符號(hào)位加上真值的絕對(duì)值。例如,1的原碼為 0000 0001,-1的原碼為1000 0001。2、反碼反碼的表示方法是:正數(shù)的反碼是其原碼,負(fù)數(shù)的反碼是在其原碼的基礎(chǔ)上,符號(hào)位不變,其余各個(gè)位取反。例如1的原碼是0000 0001,反碼也是0000 0001,而-1的原碼是1000 0001,反碼則是1111 1110。3、補(bǔ)碼補(bǔ)碼的表示方法是:正數(shù)的補(bǔ)碼就其原碼,負(fù)數(shù)的補(bǔ)碼是在其反碼的基礎(chǔ)上+1。例如1的原碼是
14、0000 0001,反碼是0000 0001,補(bǔ)碼也是0000 0001,而-1的原碼是1000 0001,反碼是1111 1110,補(bǔ)碼則是1111 1111。最終一個(gè)數(shù)的補(bǔ)碼就是該數(shù)在計(jì)算機(jī)中以二進(jìn)制形式存放的機(jī)器數(shù),例如數(shù)值1在計(jì)算機(jī)中的二進(jìn)制形式為0000 0 01,而-1在計(jì)算機(jī)中的二進(jìn)制形式為1111 1111。2.1.4 原碼、反碼、補(bǔ)碼的應(yīng)用通過前面的講解,我們了解了原碼、反碼和補(bǔ)碼,反碼與補(bǔ)碼的出現(xiàn)就是為了解決以下問題:l 使符號(hào)位能與有效值部分一起參加運(yùn)算,從而簡化運(yùn)算規(guī)則。 l 使減法運(yùn)算轉(zhuǎn)換為加法運(yùn)算,進(jìn)一步簡化計(jì)算機(jī)中運(yùn)算器的線路設(shè)計(jì)。接下來將通過兩個(gè)案例來詳細(xì)講解原
15、碼、反碼和補(bǔ)碼在計(jì)算機(jī)減法運(yùn)算中的應(yīng)用。1、機(jī)器數(shù)轉(zhuǎn)換成真值假設(shè)長度為2個(gè)字節(jié)的內(nèi)存空間中存放著二進(jìn)制數(shù)10010010 00111001,那么這塊內(nèi)存空間中存放的整數(shù)的數(shù)值是多少?因?yàn)橛?jì)算機(jī)中用一個(gè)數(shù)的最高位存放符號(hào),最高位為0表示是正數(shù),最高位為1表示是負(fù)數(shù),所以該整數(shù)是負(fù)數(shù)。推導(dǎo)過程如下所示:(1)因?yàn)樨?fù)數(shù)在內(nèi)存中以補(bǔ)碼的形式存放,所以二進(jìn)制數(shù)10010010 00111001是該負(fù)數(shù)的補(bǔ)碼;(2)因?yàn)樨?fù)數(shù)的補(bǔ)碼是在其反碼的基礎(chǔ)上+1,所以該負(fù)數(shù)的補(bǔ)碼是二進(jìn)制數(shù)10010010 00111000;(3)因?yàn)樨?fù)數(shù)的反碼是在其原碼的基礎(chǔ)上,符號(hào)位不變,其余各個(gè)位取反,所以該負(fù)數(shù)的原碼是二進(jìn)制
16、數(shù)11101101 11000111;(4)無視最高位的數(shù)值,二進(jìn)制數(shù)01101101 11000111轉(zhuǎn)換成十進(jìn)制數(shù)就是28103,再添加上符號(hào),那么二進(jìn)制數(shù)10010010 00111001的真值就是-28103。2、計(jì)算1-1的值計(jì)算機(jī)計(jì)算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)換成補(bǔ)碼,算式就成為:0000 0001 + 1111 1111;(5)對(duì)補(bǔ)碼進(jìn)行運(yùn)算,得到結(jié)果:1 000
17、0 0000;(6)因?yàn)橛?jì)算機(jī)使用8位二進(jìn)制數(shù),所以結(jié)果的第9位被舍去,所以最終結(jié)果是:0000 0000;(7)由于0000 0000是十進(jìn)制數(shù)0的補(bǔ)碼,所以計(jì)算機(jī)返回十進(jìn)制數(shù)0。2.2 關(guān)鍵字和標(biāo)識(shí)符2.2.1 關(guān)鍵字所謂關(guān)鍵字是指在編程語言里事先定義好并賦予了特殊含義的單詞,也稱作保留字。關(guān)鍵字在程序中用于表示特殊含義,不能被隨便用作變量名、函數(shù)名等,在C語言中,C89標(biāo)準(zhǔn)中共定義了32個(gè)關(guān)鍵字,具體如下:auto double intstructbreakelselongswitchcaseenumregistertypedefcharexternreturn unionconstfl
18、oatshortunsignedcontinuesignedvoiddefaultgotosizeofvolatiledostaticwhileforif上面列舉的關(guān)鍵字中,每個(gè)關(guān)鍵字都有特殊的作用,例如,int關(guān)鍵字用于聲明一個(gè)整型的變量,sizeof關(guān)鍵字用于獲取指定類型數(shù)據(jù)的長度,char關(guān)鍵字用于聲明一個(gè)字符類型的變量。在本書后面的章節(jié)中將逐步對(duì)這些關(guān)鍵字進(jìn)行講解,這里只需了解即可。2.2.2 標(biāo)識(shí)符在編程過程中,經(jīng)常需要定義一些符號(hào)來標(biāo)記一些名稱,如變量名、方法名、參數(shù)名、數(shù)組名等,這些符號(hào)被稱為標(biāo)識(shí)符。在C語言中標(biāo)識(shí)符的命名需要遵循一些規(guī)范,具體如下:l 標(biāo)識(shí)符只能由字母、數(shù)字和下
19、劃線組成。l 標(biāo)識(shí)符不能以數(shù)字作為第一個(gè)字符。l 標(biāo)識(shí)符不能使用關(guān)鍵字。l 標(biāo)識(shí)符區(qū)分大小寫字母,如add、Add和ADD是不同的標(biāo)識(shí)符。l 盡量做到“見名知意”,以增加程序的可讀性,如用age表示年齡,用length表示長度等。l 雖然ANSIC中沒有規(guī)定標(biāo)識(shí)符的長度,但建議標(biāo)識(shí)符的長度不超過8個(gè)字符。在上面的規(guī)范中,除了最后兩條外,其他的命名規(guī)范都是必須要遵守的,否則程序就會(huì)出錯(cuò)。為了讓讀者對(duì)標(biāo)識(shí)符的命名規(guī)范有更深刻地理解,接下來列舉一些合法與不合法的標(biāo)識(shí)符,具體如下:下面是一些合法的標(biāo)識(shí)符:area DATE_namelesson_1 下面是一些不合法的標(biāo)識(shí)符:3a/ 標(biāo)識(shí)符不能以數(shù)字作
20、為第一個(gè)字符ab.c/ 標(biāo)識(shí)符只能由字母、數(shù)字和下劃線組成long/ 標(biāo)識(shí)符不能使用關(guān)鍵字abc#/ 標(biāo)識(shí)符只能由字母、數(shù)字和下劃線組成2.3 常量與變量2.3.1 常量的概念常量又稱常數(shù),是指在程序運(yùn)行過程中其值不可改變的量。C語言中的常量可分為整型常量、實(shí)型常量、字符型常量、字符串常量和符號(hào)常量,下面將針對(duì)這些常量分別進(jìn)行詳細(xì)講解。1、整型常量整型常量又稱為整數(shù)。C語言中,整數(shù)可用三種形式表示,具體如下:l 十進(jìn)制整數(shù):十進(jìn)制整數(shù)沒有前綴,其數(shù)碼為09,如123、-456、0;l 八進(jìn)制整數(shù):八進(jìn)制整數(shù)必須以數(shù)字0開頭,其數(shù)碼為07,如0123表示八進(jìn)制整數(shù)123、-011表示八進(jìn)制整數(shù)-
21、11;l 十六進(jìn)制整數(shù):十六進(jìn)制整數(shù)的前綴為0X或0x,其數(shù)碼為09、AF或af,如0x36C表示十六進(jìn)制整數(shù)36C、-0x12d表示十六進(jìn)制整數(shù)-12d。2、 實(shí)型常量實(shí)型也稱為浮點(diǎn)型,實(shí)型常量也稱為實(shí)數(shù)或浮點(diǎn)數(shù),也就是在數(shù)學(xué)中用到的小數(shù)。C語言中,實(shí)型常量采用十進(jìn)制表示,它有兩種形式:十進(jìn)制小數(shù)形式和指數(shù)形式,具體示例如下:l 十進(jìn)制小數(shù)形式:由數(shù)字和小數(shù)點(diǎn)組成(注意:必須有小數(shù)點(diǎn)),如12.3、-45.6、1.0等;l 指數(shù)形式:又稱科學(xué)計(jì)數(shù)法,由于計(jì)算機(jī)輸入輸出時(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 普通字符:用單引號(hào)括起來的單個(gè)字符,如:'a'、'Z'、'3'、'?'、'#'。字符常量存儲(chǔ)在內(nèi)存中時(shí),并不是存儲(chǔ)字符(如a、Z、#等)本身,而是以其ASCII碼存儲(chǔ)的,例如字符'a'的ASCII碼是97,因此在內(nèi)存中以二進(jìn)制形式存放97。需要注意的是,單
23、引號(hào)只是界限符;字符常量只能是一個(gè)字符,不包括單引號(hào),不能寫成'ab'或'12';字符常量是區(qū)分大小寫的,'a'和'A'是不同的字符常量。l 轉(zhuǎn)義字符:有些字符是無法用一般形式來表示的,我們可以用轉(zhuǎn)義字符來表示,就是以字符''開頭的字符序列,例如'n'表示一個(gè)換行符、't'表示一個(gè)制表符。常用轉(zhuǎn)義字符如表2-6所示。表2-6 轉(zhuǎn)義字符及其作用轉(zhuǎn)義字符對(duì)應(yīng)字符輸出結(jié)果'單引號(hào)(')輸出此字符"雙引號(hào)(")輸出此字符反斜線()輸出此字符a警告(aler
24、t)產(chǎn)生聲音或視覺信號(hào)b退格(backspace)將當(dāng)前位置后退一個(gè)字符f換頁(form feed)將當(dāng)前位置移到下一頁的開頭n換行將當(dāng)前位置移到下一行的開頭r回車(carriage return)將當(dāng)前位置移到本行的開頭t水平制表符將當(dāng)前位置移到下一個(gè)tab位置v垂直制表符將當(dāng)前位置移到下一個(gè)垂直制表對(duì)齊點(diǎn)d、dd、ddd13位八進(jìn)制數(shù)表示的ASCII碼所代表的字符與該八進(jìn)制ASCII碼對(duì)應(yīng)的字符xh、xhh12位十六進(jìn)制數(shù)表示的ASCII碼所代表的字符與該十六進(jìn)制ASCII碼對(duì)應(yīng)的字符表2-6中倒數(shù)第2行是一個(gè)八進(jìn)制數(shù)表示的ASCII字符,例如'101'代表八進(jìn)制數(shù)101的
25、ASCII字符,即十進(jìn)制數(shù)65的ASCII字符'A';'012'代表八進(jìn)制數(shù)12的ASCII字符,即十進(jìn)制數(shù)10的ASCII字符'n'。表2-6中倒數(shù)第1行是一個(gè)十六進(jìn)制數(shù)表示的ASCII字符,接下來,通過一個(gè)具體的,例來演示轉(zhuǎn)義符的用法,如例22e+23f例如'x41'代表十六進(jìn)制數(shù)41的ASCII字符,也就是十進(jìn)制65的ASCII字符'A';'x20'代表十六進(jìn)制數(shù)20的ASCII字符,即十進(jìn)制數(shù)32的ASCII字符:空格字符。這兩個(gè)方法可以表示任何可顯示的字母字符、數(shù)字字符、專用字符、圖形字符
26、和控制字符。計(jì)算機(jī)使用特定的整數(shù)編碼來表示對(duì)應(yīng)的字符。我們通常使用的英文字符編碼是 ASCII(American Standard Code for Information Interchange 美國信息交換標(biāo)準(zhǔn)編碼)。ASCII編碼是一個(gè)標(biāo)準(zhǔn),其內(nèi)容規(guī)定了把英文字母、數(shù)字、標(biāo)點(diǎn)、字符轉(zhuǎn)換成計(jì)算機(jī)能識(shí)別的二進(jìn)制數(shù)的規(guī)則,并且得到了廣泛認(rèn)可和遵守。具體請(qǐng)參考附錄A中的ASCII碼表。l ASCII非打印控制字符:ASCII表上的數(shù)字0-31分配給了控制字符,用于控制像打印機(jī)等一些外圍設(shè)備(參詳ASCII碼表中0-31)。ASCII碼中9代表Tab鍵,10代表換行鍵,下面將用一個(gè)案例來
27、打印其效果,如例2-1所示。例2-1 1 #include <stdio.h> 2 void main() 3 4 printf("a%cbn", 9); 5 printf("c%cdn", 10); 6 運(yùn)行結(jié)果如圖2-3所示。圖2-3 運(yùn)行結(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)查看或打印文檔時(shí)就會(huì)出現(xiàn)。數(shù)字127代表 DELETE 命令(參詳ASCII碼表中32-127)。4、字
28、符串常量字符串常量是用一對(duì)雙引號(hào)括起來的字符序列,例如"hello"、"123"、"itcast"等。字符串的長度等于字符串中包含的字符個(gè)數(shù),例如,字符串"hello"的長度為5個(gè)字符。字符串常量與字符常量是不同的,它們之間主要的區(qū)別有:l 字符型常量使用單引號(hào)定界,字符串常量使用雙引號(hào)定界。l 字符型常量只能是單個(gè)字符,字符串常量可以包含一個(gè)或多個(gè)字符。l 可以把一個(gè)字符型常量賦給一個(gè)字符型變量,但不能把一個(gè)字符串常量賦給一個(gè)字符串變量,C語言中沒有相應(yīng)的字符串變量,只能用字符數(shù)組存放字符串常量。5、符號(hào)常量C語
29、言中也可以用一個(gè)標(biāo)識(shí)符來表示一個(gè)常量,稱為符號(hào)常量。符號(hào)常量在使用前必須先定義,其語法格式如下所示:#define 標(biāo)識(shí)符 常量上述語法格式中,define是關(guān)鍵字,前面加符號(hào)“#”,表示這是一條預(yù)處理命令(預(yù)處理命令都以符號(hào)“#”開頭),稱為宏定義。例如將圓周率用PI表示,可寫成:#define PI 3.14該語句的功能是把標(biāo)識(shí)符“PI”定義為常量3.14,定義后在程序中所有出現(xiàn)標(biāo)識(shí)符“PI”的地方均用3.14代替PI。符號(hào)常量的標(biāo)識(shí)符是用戶自己定義的。符號(hào)常量有以下特點(diǎn):l 習(xí)慣上符號(hào)常量的標(biāo)識(shí)符用大寫字母,變量標(biāo)識(shí)符用小寫字母,以示區(qū)別。l 符號(hào)常量與變量不同,符號(hào)常量的值在其作用域內(nèi)
30、不能改變,也不能再被賦值。l 使用符號(hào)常量的好處是:含義清楚,并且能做到“一改全改”。2.3.2 變量的定義在程序運(yùn)行期間,隨時(shí)可能產(chǎn)生一些臨時(shí)數(shù)據(jù),應(yīng)用程序會(huì)將這些數(shù)據(jù)保存在一些內(nèi)存單元中,每個(gè)內(nèi)存單元都用一個(gè)標(biāo)識(shí)符來標(biāo)識(shí)。這些內(nèi)存單元我們稱之為變量,定義的標(biāo)識(shí)符就是變量名,內(nèi)存單元中存儲(chǔ)的數(shù)據(jù)就是變量的值。接下來,通過一段代碼來學(xué)習(xí)變量的定義,具體如下:int x = 0, y;y = x+3;上面的代碼中,第一行代碼的作用是定義了兩個(gè)變量x和y,也就相當(dāng)于分配了兩塊內(nèi)存單元,在定義變量的同時(shí)為變量x分配了一個(gè)初始值0,而變量y沒有分配初始值,變量x和y在內(nèi)存中的狀態(tài)如圖2-4所示。圖2-
31、4 x、y變量在內(nèi)存中的狀態(tài)第二行代碼的作用是為變量賦值,在執(zhí)行第二行代碼時(shí),程序首先取出變量x的值,與3相加后,將結(jié)果賦值給變量y,此時(shí)變量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í)際上就是一個(gè)臨時(shí)存放數(shù)據(jù)的地方。在程序中,可以將指定的數(shù)據(jù)存放到變量中,方便隨時(shí)取出來再次進(jìn)行使用。變量對(duì)于一段程序的運(yùn)行是至關(guān)重要的,讀者在后續(xù)的學(xué)習(xí)中會(huì)逐步地了解變量的作用。2.3.3 變量的數(shù)據(jù)類型在應(yīng)用程序中,由于數(shù)據(jù)存儲(chǔ)時(shí)所需要的容量各不相同,因此,為了區(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)造類型、指針類型、空類型。接下來將針對(duì)基本數(shù)據(jù)類型進(jìn)行詳細(xì)地講解,關(guān)于其他數(shù)據(jù)類型將在后面章節(jié)中講解。1、整型變量在程序開發(fā)中,經(jīng)常會(huì)遇到0、-100、1024等數(shù)字,這些數(shù)字都可稱為整型。整型就是一個(gè)不包含小數(shù)部分的數(shù)。在C語言中,根據(jù)數(shù)值的取值范圍,可以將整型定義為短整型(short int)、基本整型(int)和長整型(long int)。表2-7中列舉了整數(shù)類型的長度及其取值范圍。表2-7 整數(shù)類型的長度及其取值范圍修飾符數(shù)據(jù)類型占用空間取值范圍signed
33、short int16位(2個(gè)字節(jié))-32768到32767 (-215 215-1)int32位(4個(gè)字節(jié))-2147483648到2147483647 (-231 231-1)long int32位(4個(gè)字節(jié))-2147483648到2147483647 (-231 231-1)unsignedshort int16位(2個(gè)字節(jié))0到65535 (0 216-1)int32位(4個(gè)字節(jié))0到4294967295 (0 232-1)long int32位(4個(gè)字節(jié))0到4294967295 (0 232-1)從表2-7中可以看出,整數(shù)類型可分為short、int和long,這三種類型可以被s
34、igned和unsigned修飾。其中,被signed修飾的整數(shù)類型稱為有符號(hào)的整數(shù)類型,被unsigned修飾的稱為無符號(hào)的整數(shù)類型。它們之間最大的區(qū)別是無符號(hào)類型可以存放的正數(shù)范圍比有符號(hào)類型中的范圍大一倍,例如,int的取值范圍是-231231-1,而unsigned int的取值范圍是0232-1。默認(rèn)情況下,整型數(shù)據(jù)都是有符號(hào)的,此時(shí)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類型。通過對(duì)表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是無符號(hào)整數(shù)輸出格式 9 printf("unsigned int:%un", UINT_MAX); 10 printf("unsigned long:%un", ULONG_MAX); 11 system("pause"); 12 運(yùn)行結(jié)果如圖2-7所示。圖2-7 運(yùn)行結(jié)果在圖2-7中可以看出,將short、int、long的有符號(hào)與無符號(hào)極值都打印出來,與表2-6的一致。關(guān)于宏定義的相關(guān)知識(shí),將在第8章詳細(xì)講解,這里同學(xué)們只需了
37、解這些不同的宏定義對(duì)應(yīng)著不同數(shù)據(jù)類型的極值即可。&多學(xué)一招:計(jì)算機(jī)的數(shù)據(jù)單位位(bit):電子計(jì)算機(jī)中最小的數(shù)據(jù)單位,每一位的狀態(tài)只能是0或1。字節(jié)(byte):8個(gè)二進(jìn)制位構(gòu)成1個(gè)字節(jié),它是存儲(chǔ)空間的基本計(jì)量單位。1個(gè)字節(jié)可以儲(chǔ)存1個(gè)英文字母或者半個(gè)漢字,換句話說,1個(gè)漢字占據(jù)2個(gè)字節(jié)的存儲(chǔ)空間。KB:在一般的計(jì)量單位中,通常K表示1000,例如:1公里=1000米,經(jīng)常被寫為1km;1公斤=1000克,寫為1kg。同樣K在二進(jìn)制中也有類似的含義,只是這時(shí)K表示1024,也就是2的10次方。1KB表示1K個(gè)Byte,也就是1024個(gè)字節(jié)。MB:計(jì)量單位中的M(兆)是10的6次方,見到
38、M自然想起要在該數(shù)值的后邊續(xù)上六個(gè)0,即擴(kuò)大一百萬倍。在二進(jìn)制中,MB也表示到了百萬級(jí)的數(shù)量級(jí),但1MB不正好等于1000000字節(jié),而是1048576字節(jié),即 1MB = 2E+20 Bytes = 1048576Bytes,也就是1024KB。GB:比MB更大的單位,1GB=1024MB=220KB=230B。TB:比GB更大的單位,1TB=1024GB。2、實(shí)型變量實(shí)型變量也可以稱為浮點(diǎn)型變量,浮點(diǎn)型變量是用來存儲(chǔ)小數(shù)數(shù)值的。在C語言中,浮點(diǎn)型變量分為兩種:單精度浮點(diǎn)數(shù)(float)、雙精度浮點(diǎn)數(shù)(double),但是double型變量所表示的浮點(diǎn)數(shù)比float型變量更精確。表2-8列舉
39、了兩種不同浮點(diǎn)型數(shù)所占用的存儲(chǔ)空間大小及取值范圍。表2-8 浮點(diǎn)類型長度及其取值范圍類型名占用空間 取值范圍float32位(4個(gè)字節(jié))1.4E-45 3.4E+38,-1.4E-45 -3.4E+38double64位(8個(gè)字節(jié))4.9E-324 1.7E+308, -4.9E-324 -1.7E+308表2-8中列出了兩種浮點(diǎn)數(shù)類型變量所占的空間大小和取值范圍。在取值范圍中,E表示以10為底的指數(shù),E后面的“+”號(hào)和“-”號(hào)代表正指數(shù)和負(fù)指數(shù),例如,1.4E-45表示1.4*10-45。為了讓讀者更好地理解浮點(diǎn)型數(shù)據(jù)在內(nèi)存中的存儲(chǔ)方式,接下來以單精度浮點(diǎn)數(shù)3.14159為例進(jìn)行詳細(xì)講解,如
40、圖2-8所示。圖2-8 單精度浮點(diǎn)數(shù)存儲(chǔ)方式在圖2-8中,浮點(diǎn)數(shù)包含符號(hào)位、小數(shù)位和指數(shù)位三部分,例如,小數(shù)3.14159在內(nèi)存中的符號(hào)位為“+”,小數(shù)部分為.314159,指數(shù)位為1,連接在一起即為“+0.314159 * 101 = 3.14159”。在C語言中,一個(gè)小數(shù)會(huì)被默認(rèn)為double類型的值,在為一個(gè)float類型變量賦值時(shí)可以在后面加上字母“F”(或者小寫“f”),double類型變量后加上“D”(或者小寫“d”)來加以區(qū)分。但C語言在為變量賦值時(shí)可以自動(dòng)轉(zhuǎn)換類型,所以后綴可以省略,具體示例如下:float f = 123.4f;/ 為一個(gè)float類型的變量賦值,后面可以加上
41、字母fdouble d2 = 199.3d;/ 為一個(gè)double類型的變量賦值,后面可以加上字母d另外,在程序中也可以為一個(gè)浮點(diǎn)數(shù)類型變量賦予一個(gè)整數(shù)數(shù)值,示例如下:float f = 100;/ 聲明一個(gè)float類型的變量并賦整數(shù)值double d = 100;/ 聲明一個(gè)double類型的變量并賦整數(shù)值M腳下留心:float和double精確度由于浮點(diǎn)型變量是由有限的存儲(chǔ)單元組成的,因此只能提供有限的有效數(shù)字。在有效位以外的數(shù)字將不精確。雙精度浮點(diǎn)數(shù)的有效位數(shù)更多,比單精度浮點(diǎn)數(shù)更能精確表達(dá)數(shù)據(jù),它能提供15-16位有效位數(shù),而單精度浮點(diǎn)數(shù)只能提供6-7位有效位數(shù)。例如,將1.1234
42、5678910111213賦給一個(gè)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ù)點(diǎn)后17位 7 運(yùn)行結(jié)果如圖2-9所示。圖2-9 運(yùn)行結(jié)果從圖2-9中可以看出,float類型的f變量精確到小數(shù)點(diǎn)后6位,double類型
43、的d精確到小數(shù)點(diǎn)后15位,其后的數(shù)進(jìn)行了四舍五入。3、字符型變量字符型變量用于存儲(chǔ)一個(gè)單一字符,在C語言中用char表示,其中每個(gè)字符變量都會(huì)占用1個(gè)字節(jié)。在給字符型變量賦值時(shí),需要用一對(duì)英文半角格式的單引號(hào)(' ')把字符括起來,例如,'A'的聲明方式如下所示:char ch = 'A'/ 為一個(gè)char類型的變量賦值字符'a'上述代碼中,將字符常量“A”放到字符變量ch中,實(shí)際上并不是把該字符本身放到變量的內(nèi)存單元中去,而是將該字符對(duì)應(yīng)的ASCII編碼放到變量的存儲(chǔ)單元中,例如:ASCII 使用編號(hào) 65&
44、#160;來對(duì)應(yīng)大寫字母“A”,因此變量ch存儲(chǔ)的是整數(shù)65,而不是字母“A”本身。接下來通過一個(gè)案例來說明字符變量如何存放字符常量,如例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 運(yùn)行結(jié)果如圖2-10所示。圖2-10 ASCII字符例2-4中,定義了兩個(gè)char類型變量,分別賦值為字符“A”和數(shù)字65,然后通過pri
45、ntf()函數(shù)把兩個(gè)變量的內(nèi)容以字符形式打印到屏幕上。從圖2-10中可以看出,兩個(gè)變量輸出的結(jié)果是一樣的,這說明對(duì)于字符型來說,A和65其實(shí)沒什么區(qū)別。嚴(yán)格來說,字符類型也是整型類型。需要注意的是,除了可以直接從鍵盤上輸入的字符(如英文字母,標(biāo)點(diǎn)符號(hào),數(shù)字,數(shù)學(xué)運(yùn)算符等)以外,還有一些字符是無法用鍵盤直接輸入的,比如,“回車”,此時(shí)需要采用一種新的定義方式轉(zhuǎn)義字符,它以反斜杠()開頭,隨后接特定的字符。接下來,通過一個(gè)具體的案例來演示轉(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 運(yùn)行結(jié)果如圖2-11所示。圖2-11 ASCII字符的輸出結(jié)果在例2-5中定義了四個(gè)字符型變量,其中ch2被賦值為轉(zhuǎn)義字符“n”
47、即換行符,ch4被賦值為轉(zhuǎn)義字符“”即反斜杠。從第8行到第11行按照順序分別將五個(gè)變量的值輸出到屏幕上,我們會(huì)發(fā)現(xiàn)輸出字符A之后另起一行輸出字符B,轉(zhuǎn)義字符“n”的作用就是控制輸出結(jié)果另起一行;字符B后輸出的是字符“”。第12行為了使輸出結(jié)果的格式清晰一些又輸出了一個(gè)換行符,防止程序結(jié)束后命令行提示符緊跟在輸出結(jié)果的后面。4、枚舉類型變量在日常生活中有許多對(duì)象的值是有限的,可以一一列舉出來。例如一個(gè)星期內(nèi)只有七天、一年只有十二個(gè)月等等。如果把這些量說明為整型,字符型或其它類型顯然是不妥當(dāng)?shù)?。為此,C語言提供了一種稱為“枚舉”的類型。枚舉類型就是其值可以被一一列舉出來,并且變量的取值不能超過定義
48、的范圍。枚舉類型的聲明方式比較特殊,具體格式如下:enum 枚舉名 標(biāo)識(shí)符1 = 整型常量1, 標(biāo)識(shí)符2 = 整型常量2, .;在上述代碼中,enum表示聲明枚舉的關(guān)鍵字,枚舉名表示枚舉對(duì)象的名稱。為了讓讀者更好的理解枚舉類型的使用,接下來通過定義一個(gè)枚舉類型來進(jì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 ;上面的代碼中,聲明了一個(gè)枚舉類型對(duì)象month,然后就可以使用此類型來定義變量。接下來,通過一個(gè)具體案例來學(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 運(yùn)行結(jié)果如圖2-12所示。圖2-12 運(yùn)行結(jié)果在例2-6中,第2行代碼定義了一個(gè)枚舉類型,其中,枚舉名month是一個(gè)標(biāo)識(shí)符,大括號(hào)中的內(nèi)容被稱為枚舉值表;枚舉值表內(nèi)的標(biāo)識(shí)符JAN、FEB、MAR等被稱作枚舉元素,枚舉元素是被命名的整型常量,枚舉值表中羅列出所有可用值,枚舉成員對(duì)應(yīng)的值是枚舉值,枚舉類型的定義以分號(hào)結(jié)束。第6行定義了三個(gè)枚舉變量,在后面的代碼中分別進(jìn)行了賦值,最后依次將這三個(gè)枚舉變量的值輸出到顯示器。可以看出輸出結(jié)果為枚舉元素對(duì)應(yīng)的值。需要注意的是,枚舉值是常量,不是變量,在程序中不能賦值。例如在主函數(shù)
51、中,對(duì)MAR再次賦值是錯(cuò)誤的。&多學(xué)一招:枚舉變量的快速定義在枚舉中規(guī)定,如果不給標(biāo)識(shí)符指定具體的值,會(huì)默認(rèn)該標(biāo)識(shí)符的值等于前一標(biāo)識(shí)符的值加1。因此可以將上面的定義簡化成:enum monthJAN=1, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC;如果不指定第一個(gè)標(biāo)識(shí)符對(duì)應(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 運(yùn)行結(jié)果如圖2-13所示。圖2-13 運(yùn)行結(jié)果在例2-7中,首先用枚舉定義了一組常量C1到C9,并向顯示器輸出常量C1的數(shù)值。作為讀者,在編譯和運(yùn)行該例程之前,最好先試著猜測C1到C9這九個(gè)常量的數(shù)值。2.3.4 數(shù)據(jù)類型的轉(zhuǎn)換在C語言程序中,經(jīng)常需要對(duì)不同類型的數(shù)據(jù)進(jìn)行運(yùn)算,為了解決數(shù)據(jù)類型不一致的問題,需要對(duì)數(shù)據(jù)的類型進(jìn)行轉(zhuǎn)換。例如一個(gè)浮點(diǎn)數(shù)和一個(gè)整數(shù)相加,必須先將兩個(gè)數(shù)轉(zhuǎn)換成同一類型。C語言程序中的類型轉(zhuǎn)換可分為隱式和強(qiáng)制類型轉(zhuǎn)換兩種,具體如下:1、隱式類型轉(zhuǎn)
53、換隱式類型轉(zhuǎn)換又稱為自動(dòng)類型轉(zhuǎn)換,隱式類型轉(zhuǎn)換可分為三種:算術(shù)轉(zhuǎn)換、賦值轉(zhuǎn)換和輸出轉(zhuǎn)換。(1)算術(shù)轉(zhuǎn)換:進(jìn)行算術(shù)運(yùn)算(加、減、乘、除、取余以及符號(hào)運(yùn)算)時(shí),不同類型數(shù)招必須轉(zhuǎn)換成同一類型的數(shù)據(jù)才能運(yùn)算。算術(shù)轉(zhuǎn)換原則為: 對(duì)于所有比int小的類型,包括char、unsigned char、short、unsigned short,首先會(huì)提升為int類型。 在進(jìn)行運(yùn)算時(shí),以表達(dá)式中最長類型為主,將其他類型位據(jù)均轉(zhuǎn)換成該類型,如:l 若運(yùn)算數(shù)中有double型或float型,則其他類型數(shù)據(jù)均轉(zhuǎn)換成double類型進(jìn)行運(yùn)算。l 若運(yùn)算數(shù)中最長的類型為long型則其他類型數(shù)均轉(zhuǎn)換成long型數(shù)。l 若運(yùn)
54、算數(shù)中最長類型為int型,則char型也轉(zhuǎn)換成int型進(jìn)行運(yùn)算。特別注意的是有符號(hào)和無符號(hào)之間的轉(zhuǎn)換:long與unsigned int在32位機(jī)器上都是4字節(jié),所以均轉(zhuǎn)換為unsigned long。signed與unsigned int,signed會(huì)轉(zhuǎn)換為unsigned。如果int恰好為負(fù)數(shù),其結(jié)果為對(duì)unsigned取值求模的結(jié)果。比如將-1賦給8位的unsigned char,那么結(jié)果就是255(-1對(duì)256取模后的值)。unsigned char取值范圍0255。(2)賦值轉(zhuǎn)換:進(jìn)行賦值操作時(shí),賦值運(yùn)算符右邊的數(shù)據(jù)類型必須轉(zhuǎn)換成賦值號(hào)左邊的類型,若右邊的數(shù)據(jù)類型的長度大于左邊,則
55、要進(jìn)行截?cái)嗷蛏崛氩僮?。下面用?shí)例進(jìn)行說明:char ch;int i, result;float f;double d;result=ch/i+(f*d-i); 首先計(jì)算“ch/i”,因?yàn)樽兞縤是int型,所以變量ch轉(zhuǎn)換為int型,“ch/i”返回int型結(jié)果。 接著計(jì)算“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”進(jìn)行加運(yùn)算,由于“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型,即進(jìn)行截?cái)嗯c舍入,最后取值為整型。(3)輸出轉(zhuǎn)換:在程序中將數(shù)據(jù)用printf()函數(shù)以指定格式輸出時(shí),當(dāng)要輸出的數(shù)據(jù)類型與輸出格式不符時(shí),便自動(dòng)進(jìn)行類型轉(zhuǎn)換,如一個(gè)整(int)型數(shù)據(jù)用字符(char)型格式(%c)輸出時(shí),相當(dāng)于將int型轉(zhuǎn)換成char型數(shù)據(jù)輸出;一個(gè)字符(char)型數(shù)據(jù)用整(int)型格式輸出時(shí),相當(dāng)于將char型轉(zhuǎn)換成int型輸出。需要注意的是,較長型數(shù)據(jù)轉(zhuǎn)換成短型數(shù)據(jù)輸出時(shí),其值不能超出短型數(shù)據(jù)允許的值范圍,否則轉(zhuǎn)換時(shí)將出錯(cuò),例如:int a=321;printf("%c",a);運(yùn)行結(jié)果為“A”,因?yàn)閏har型允許的最大值為255,321超出此值,故結(jié)果取以256為模的余數(shù),即進(jìn)行取余運(yùn)算:321%2
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 廣東碧桂園職業(yè)學(xué)院《電力系統(tǒng)基礎(chǔ)》2023-2024學(xué)年第一學(xué)期期末試卷
- 廣安職業(yè)技術(shù)學(xué)院《模擬集成電路設(shè)計(jì)》2023-2024學(xué)年第一學(xué)期期末試卷
- 共青科技職業(yè)學(xué)院《表演基礎(chǔ)元素訓(xùn)練》2023-2024學(xué)年第一學(xué)期期末試卷
- 外部施工安全培訓(xùn)課件
- 贛南醫(yī)學(xué)院《無線傳感器網(wǎng)絡(luò)》2023-2024學(xué)年第一學(xué)期期末試卷
- 贛南師范大學(xué)《游戲原畫設(shè)計(jì)》2023-2024學(xué)年第一學(xué)期期末試卷
- 贛南科技學(xué)院《玻陶工藝學(xué)》2023-2024學(xué)年第一學(xué)期期末試卷
- 甘肅中醫(yī)藥大學(xué)《史學(xué)論文寫作》2023-2024學(xué)年第一學(xué)期期末試卷
- 七年級(jí)語文上冊(cè)第五單元?jiǎng)游锸澜?8狼教案新人教版
- 三年級(jí)數(shù)學(xué)上冊(cè)第三單元測量第6課時(shí)噸的認(rèn)識(shí)教案新人教版
- 紙箱紙板材料安全數(shù)據(jù)說明書(MSDS)
- 2022-2023小學(xué)二年級(jí)體育上冊(cè)期末考試試卷及答案
- 2023年運(yùn)維主管年終業(yè)務(wù)工作總結(jié)
- 電氣設(shè)備火災(zāi)現(xiàn)場處理措施
- 《格林童話》課外閱讀試題及答案
- “銷售技巧課件-讓你掌握銷售技巧”
- 2019北師大版高中英語選修一UNIT 2 單詞短語句子復(fù)習(xí)默寫單
- 房地產(chǎn)項(xiàng)目保密協(xié)議
- 2023年云南省初中學(xué)業(yè)水平考試 物理
- 【安吉物流股份有限公司倉儲(chǔ)管理現(xiàn)狀及問題和優(yōu)化研究15000字(論文)】
- 火災(zāi)自動(dòng)報(bào)警系統(tǒng)施工及驗(yàn)收調(diào)試報(bào)告
評(píng)論
0/150
提交評(píng)論