C語(yǔ)言課件:第7章 基本類型_第1頁(yè)
C語(yǔ)言課件:第7章 基本類型_第2頁(yè)
C語(yǔ)言課件:第7章 基本類型_第3頁(yè)
C語(yǔ)言課件:第7章 基本類型_第4頁(yè)
C語(yǔ)言課件:第7章 基本類型_第5頁(yè)
已閱讀5頁(yè),還剩76頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、1 第7章基本類型基本類型C語(yǔ)言的基本(內(nèi)置的)類型:整型(int),包括長(zhǎng)整型、短整型和無符號(hào)整型浮點(diǎn)型,包括浮點(diǎn)型 (float), 雙精度浮點(diǎn)型(double)和長(zhǎng)雙精度浮點(diǎn)型(long double) 字符型(char)布爾型(_Bool (C99) )27.1 整數(shù)類型C語(yǔ)言支持兩種根本不同的數(shù)值類型:整型和浮點(diǎn)型。整型的值全都是數(shù)。浮點(diǎn)型的值則可能還有小數(shù)部分。整型又分為兩類:有符號(hào)的和無符號(hào)的。3有符號(hào)整數(shù)和無符號(hào)整數(shù)在有符號(hào)數(shù)中,如果數(shù)為正數(shù)或零,那么最左邊的位(符號(hào)位)為0,如果是負(fù)數(shù),符號(hào)位為1。最大的16位整數(shù)的二進(jìn)制表示形式是0111111111111111, 對(duì)應(yīng)的值

2、是32,767 (215 1)。最大的32位整數(shù)是01111111111111111111111111111111,數(shù)值為2,147,483,647 (231 1)。不帶符號(hào)位的整數(shù)(最左邊的位是數(shù)值的一部分)稱為無符號(hào)整數(shù)。最大的16位無符號(hào)整數(shù)65,535 (216 1)。最大的32位無符號(hào)整數(shù)是4,294,967,295 (232 1)。4有符號(hào)整數(shù)和無符號(hào)整數(shù)默認(rèn)情況下,C語(yǔ)言中的整型變量都是有符號(hào)的,也就是說最左邊保留為符號(hào)位。為了告訴編譯器變量沒有符號(hào)位,需要把它聲明成unsigned類型。無符號(hào)數(shù)主要用于系統(tǒng)編程和低級(jí)的、與機(jī)器相關(guān)的應(yīng)用。5整型的細(xì)分int型通常有32位,但在一

3、些老的CPU上可能是16位的。長(zhǎng)整型比一般int型具有更多的位,短整型則具有更少的位。關(guān)鍵字(說明符)long、short以及signed、unsigned可以與int組合起來構(gòu)造int類型。只有以下6種組合產(chǎn)生不同的類型:short intunsigned short intintunsigned intlong intunsigned long int關(guān)鍵字的順序沒有要求,單詞int也可以省略(long int可以縮寫為long)。6整型的取值范圍6種整型的取值范圍隨機(jī)器的不同而不同。 C標(biāo)準(zhǔn)要求short int、int和long int中的每一種類型都要覆蓋一個(gè)確定的最小取值范圍。其次

4、,int類型不能比short int類型短,而long int不能比int類型短。7整型的取值范圍16位機(jī)器上整型通常的取值范圍: 類型 最小值 最大值short int 32,768 32,767unsigned short int065,535int32,768 32,767unsigned int0 65,535long int2,147,483,6482,147,483,647unsigned long int04,294,967,2958整型的取值范圍32位機(jī)器上整型通常的取值范圍: 類型 最小值 最大值short int32,768 32,767unsigned short int

5、0 65,535int2,147,483,6482,147,483,647unsigned int0 4,294,967,295long int2,147,483,6482,147,483,647unsigned long int0 4,294,967,2959整型的取值范圍64位機(jī)器上整型通常的取值范圍: 類型 最小值 最大值short int32,768 32,767unsigned short int0 65,535int2,147,483,6482,147,483,647unsigned int0 4,294,967,295long int263 2631unsigned long i

6、nt02641標(biāo)準(zhǔn)庫(kù) 頭文件 可以找到定義了每種整數(shù)最大值和最小值的宏。10C99中的整型C99 提供了兩種附加的標(biāo)準(zhǔn)整型:long long int 和 unsigned long long int.這兩種long long類型都要求至少64位。long long int 的取值范圍通常是 263 (9,223,372,036,854,775,808) 到 263 1 (9,223,372,036,854,775,807).unsigned long long int 的取值范圍通常是 0 到 264 1 (18,446,744,073,709,551,615).11整型常量常量是在程序中以

7、文本形式出現(xiàn)的數(shù)。C語(yǔ)言允許用十進(jìn)制、八進(jìn)制和十六進(jìn)形式書寫整型常量。12八進(jìn)制和十六進(jìn)制數(shù)八進(jìn)制數(shù)是用07的數(shù)字編寫的。 每一位表示一個(gè)8次冪。八進(jìn)制數(shù)237表示成十進(jìn)制數(shù)為:2 82 + 3 81 + 7 80 = 128 + 24 + 7 = 159。十六進(jìn)制數(shù)是用09的數(shù)字加上AF的字母編寫的,其中字母AF分別1015的數(shù)。十六進(jìn)制數(shù)1AF 的十進(jìn)制數(shù)值是 1 162 + 10 161 + 15 160 = 256 + 160 + 15 = 431。13整型常量十進(jìn)制常量包含數(shù)字09,但是一定不能以零開頭:15 255 32767八進(jìn)制常量只包含數(shù)字07,而且必須要以零開頭:017 0

8、377 077777十六進(jìn)制常量包含數(shù)字09和字母af,而且總是以0 x開頭:0 xf 0 xff 0 x7fff十六進(jìn)制常量中的字母即可以使大寫字母也可以是小寫字母: 0 xff 0 xfF 0 xFf 0 xFF 0Xff 0XfF 0XFf 0XFF14整型常量十進(jìn)制常量的類型通常是int。 如果常量太大,達(dá)到超出long int的范圍,編譯器會(huì)將其作為unsigned long int 來處理。15整型常量為了強(qiáng)制內(nèi)置編譯器把常量作為長(zhǎng)整型數(shù)來處理,只需在后邊加上一個(gè)字母L(或l):15L 0377L 0 x7fffL為了指明是無符號(hào)常量,可以在常量后邊加上字母U(或u):15U 03

9、77U 0 x7fffU為了表示常量是長(zhǎng)且無符號(hào)的可以組合使用字母L和U:0 xffffffffUL字母L和U的順序和大小寫都沒有關(guān)系。16整型溢出當(dāng)對(duì)整型執(zhí)行算術(shù)運(yùn)算,其結(jié)果有可能超出整型的表示范圍。 例如,當(dāng)兩個(gè)整型數(shù)進(jìn)行算術(shù)運(yùn)算,其結(jié)果必須表示為整型。 如果運(yùn)算結(jié)果不能表示為整型,那么此時(shí)就發(fā)生了溢出。17整型溢出整型溢出發(fā)生時(shí)的表現(xiàn)跟操作數(shù)是有符號(hào)的還是符號(hào)的有關(guān):有符號(hào)整數(shù)運(yùn)算發(fā)生的溢出,程序的行為是沒有定義的(不確定的)。 無符號(hào)整數(shù)運(yùn)算發(fā)生溢出時(shí),運(yùn)算的結(jié)果是有定義(確定的),即為正確結(jié)果模除 2n的結(jié)果,其中n是存儲(chǔ)運(yùn)算結(jié)果的位數(shù)。18讀/寫整數(shù)讀和寫無符號(hào)/短和長(zhǎng)整型整數(shù)需要

10、一些新的轉(zhuǎn)換說明符。當(dāng)讀寫無符號(hào)整數(shù)時(shí),使用字母u、o或x代替轉(zhuǎn)換說明中的d。unsigned int u;scanf(%u, &u); /* reads u in base 10 */printf(%u, u); /* writes u in base 10 */scanf(%o, &u); /* reads u in base 8 */printf(%o, u); /* writes u in base 8 */scanf(%x, &u); /* reads u in base 16 */printf(%x, u); /* writes u in base 16 */19讀/寫整數(shù)當(dāng)讀寫短

11、整型數(shù)時(shí),在d、o、u或x前面加上字母h:short s;scanf(%hd, &s);printf(%hd, s);當(dāng)讀寫長(zhǎng)整型數(shù)時(shí),在d、o、u或x前面加上字母l。當(dāng)讀寫長(zhǎng)長(zhǎng)整型數(shù)時(shí),在d、o、u或x前面加上字母ll(C99標(biāo)準(zhǔn))。20程序:數(shù)列求和(改進(jìn)版)這個(gè)程序的一個(gè)問題就是所求出的和(或其中某個(gè)輸入數(shù))可能會(huì)超出int型變量允許的最大值。如果程序運(yùn)行在用16位長(zhǎng)度表示整數(shù)的機(jī)器上,可能會(huì)發(fā)生這類情況:This program sums a series of integers.Enter integers (0 to terminate): 10000 20000 30000 0T

12、he sum is: -5536當(dāng)溢出發(fā)生在有符號(hào)整數(shù)上,輸出結(jié)果是沒有意義的。這個(gè)可以通過將變量改換成long int型進(jìn)行改進(jìn)。21sum2.c/* Sums a series of numbers (using long variables) */#include int main(void) long n, sum = 0; printf(This program sums a series of integers.n); printf(Enter integers (0 to terminate): ); scanf(%ld, &n); while (n != 0) sum += n

13、; scanf(%ld, &n); printf(The sum is: %ldn, sum); return 0;227.2 浮點(diǎn)類型C語(yǔ)言提供了三種浮點(diǎn)型,它們對(duì)應(yīng)不同的浮點(diǎn)格式:float:?jiǎn)尉雀↑c(diǎn)數(shù)double:雙精度浮點(diǎn)數(shù)擴(kuò)展雙精度浮點(diǎn)數(shù)237.2 浮點(diǎn)類型float適合精度要求不嚴(yán)格的浮點(diǎn)數(shù)。 double類型為大部分的程序提供了足夠的精度。 long double 很少用到。C標(biāo)準(zhǔn)沒有說明float、double和long double類型提供的精度到底是多少,因?yàn)椴煌挠?jì)算機(jī)可以用不同的方法存儲(chǔ)浮點(diǎn)數(shù)。 大多數(shù)現(xiàn)代計(jì)算機(jī)和工作站都遵循IEEE標(biāo)準(zhǔn)的規(guī)范754。24IEEE浮點(diǎn)

14、標(biāo)準(zhǔn)IEEE 標(biāo)準(zhǔn)754由IEEE開發(fā)。主要提供了兩種主要的浮點(diǎn)數(shù)格式:?jiǎn)尉?32位)和雙精度(64位)。 數(shù)值以科學(xué)計(jì)數(shù)法的形式存儲(chǔ),每一個(gè)數(shù)都是由符號(hào)、指數(shù)和小數(shù)三部分構(gòu)成。單精度格式中,指數(shù)長(zhǎng)度為8位,而小數(shù)部分占了23位。表示的最大值大約是3.40 1038, 其中精度是6個(gè)十進(jìn)制數(shù)字。25浮點(diǎn)類型取值范圍根據(jù)IEEE標(biāo)準(zhǔn)實(shí)現(xiàn)浮點(diǎn)型的特征: 類型 最小正值 最大值 精度float 1.17549 1038 3.40282 1038 6 digitsdouble 2.22507 10308 1.79769 10308 15 digits不遵循IEEE標(biāo)準(zhǔn)的計(jì)算機(jī)上,該表無效。事實(shí)上,在

15、一些機(jī)器上,float可以有和double相同的數(shù)值集合,或double可以有和long double相同的數(shù)值。 26浮點(diǎn)類型頭文件可以在 中找到定義浮點(diǎn)型特征的宏。27浮點(diǎn)常量浮點(diǎn)常量可以有多種書寫方式。 57.0的有效寫法如下:57.0 57. 57.0e0 57E0 5.7e1 5.7e+1.57e2 570.e-1浮點(diǎn)常量必須包含小數(shù)點(diǎn)或指數(shù);指數(shù)是10的冪,指明數(shù)的大小。 如果有指數(shù),必須在指數(shù)數(shù)值前放置字母E(或e)??蛇x項(xiàng)+或-可以出現(xiàn)在字母E(或e)的后邊。28浮點(diǎn)常量默認(rèn)情況下,浮點(diǎn)常量都以雙精度數(shù)的形式存儲(chǔ)。為了表明只需要單精度,可以在常量的末尾處加上字母F(或f)(如5

16、7.0F)。為了表明必須以long double格式存儲(chǔ),可以再常量的末尾處加上字母L(或l)(如57.0L)。29讀/寫浮點(diǎn)數(shù)轉(zhuǎn)換說明符%e、%f和%g用于讀寫單精度浮點(diǎn)數(shù)。當(dāng)讀取double類型的數(shù)值時(shí),在e、f或g前放置字母l:double d;scanf(%lf, &d);注意:只能在scanf函數(shù)格式串中使用l,不能在printf函數(shù)格式串中使用。在printf函數(shù)格式串中,轉(zhuǎn)換符e、f和g可以用來寫(即顯示)float型或double型值。 當(dāng)讀寫long double類型的值時(shí),在e、f或g前放置字母L(大寫)。307.3 字符類型char類型的值可以根據(jù)計(jì)算機(jī)的不同而不同,因?yàn)?/p>

17、不同的機(jī)器可能會(huì)有不同的字符集。31字符集當(dāng)今最常用的字符集是ASCII (美國(guó)信息交換標(biāo)準(zhǔn)碼), 它用7位代碼表示128個(gè)字符。ASCII常被擴(kuò)展為8位代碼用于表示256個(gè)字符代碼,被稱為L(zhǎng)atin-1,提供一些西歐和許多非洲語(yǔ)言所需的字符。32字符集char類型的變量能被賦值為任何單個(gè)字符:char ch;ch = a; /* lower-case a */ch = A; /* upper-case A */ch = 0; /* zero */ch = ; /* space */注意,字符常量需要用單引號(hào)括起來,而不是雙引號(hào)。33字符操作在C語(yǔ)言中字符的操作非常簡(jiǎn)單,C語(yǔ)言會(huì)按小整數(shù)的方式

18、處理字符。在ASCII碼中,字符的取值范圍是0000000 1111111,這個(gè)范圍可以看成是0127的整數(shù)。 字符 a 的值為97, A的值為65, 0 的值為 48, and 的值為32。字符常量實(shí)際上是int類型,而不是char類型。34字符操作當(dāng)計(jì)算中出現(xiàn)字符時(shí),C語(yǔ)言只是使用它對(duì)應(yīng)的整數(shù)值??紤]下面的例子,假設(shè)采用ASCII碼字符集:char ch;int i;i = a; /* i is now 97 */ch = 65; /* ch is now A */ch = ch + 1; /* ch is now B */ ch+; /* ch is now C */35字符操作字符可以

19、像數(shù)那樣進(jìn)行比較。下面的if語(yǔ)句測(cè)試ch是否含有小寫字母;如果有,那么它會(huì)把ch轉(zhuǎn)化為相應(yīng)的大寫字母。if (a = ch & ch = z) ch = ch - a + A;諸如a = ch這樣的比較使用的是字符所對(duì)應(yīng)的整數(shù)值這些數(shù)值依據(jù)使用的字符集有所不同,所以程序使用, , 和 = 來進(jìn)行字符比較可能不易移植。36字符操作字符擁有和數(shù)相同的屬性,這一事實(shí)會(huì)帶來一些好處。例如,for語(yǔ)句中的控制變量可以簡(jiǎn)單采用大寫字母:for (ch = A; ch = Z; ch+) 以數(shù)的方式處理字符的缺點(diǎn):可能會(huì)導(dǎo)致編譯器無法檢查出來的錯(cuò)誤。導(dǎo)致編寫出諸如a * b / c的無意義的表達(dá)式。可能會(huì)妨

20、礙程序的可移植性,因?yàn)槌绦蚩赡軙?huì)基于一些對(duì)字符集的假設(shè)。37有符號(hào)和無符號(hào)字符char類型類似整型,存在有符號(hào)和無符號(hào)兩種。有符號(hào)字符通常的取值范圍是128 127,無符號(hào)型字符的取值范圍則是0255。一些編譯器按有符號(hào)型處理字符,而另外一些編譯器則將它們處理成無符號(hào)型數(shù)據(jù)。大多數(shù)時(shí)候,沒有太大關(guān)系。C語(yǔ)言允許使用單詞signed和unsigned來修飾char類型:signed char sch;unsigned char uch;38轉(zhuǎn)義序列字符常量通常是用單引號(hào)括起來的字符。然而,一些特殊符號(hào)是無法采用上述這種書寫方式的,比如換行符,因?yàn)樗鼈兪遣豢梢姷模o法打印的),或者無法從鍵盤輸入的

21、。 轉(zhuǎn)義序列提供了一種呈現(xiàn)這類特殊符號(hào)的方法。轉(zhuǎn)義序列共有兩種:字符轉(zhuǎn)義序列和數(shù)字轉(zhuǎn)義序列。39轉(zhuǎn)義序列字符轉(zhuǎn)義序列:名稱轉(zhuǎn)義序列Alert (bell)aBackspacebForm feedfNew linenCarriage returnrHorizontal tabtVertical tabvBackslashQuestion mark?Single quoteDouble quote40轉(zhuǎn)義序列字符轉(zhuǎn)義序列使用起來很方便,但是沒有包含所有無法打印的ASCII字符。也無法用于表示基本的128個(gè)ASCII碼字符以外的字符。數(shù)字轉(zhuǎn)義序列可以表示任何字符,所以它可以解決上述問題。對(duì)特殊字符,

22、數(shù)字轉(zhuǎn)義序列使用這些字符的八進(jìn)制或十六進(jìn)制值。例如,ASCII碼轉(zhuǎn)義字符(十進(jìn)制值為27) 對(duì)應(yīng)的八進(jìn)制值為33,對(duì)應(yīng)的十六進(jìn)制值為1B。41轉(zhuǎn)義序列八進(jìn)制轉(zhuǎn)義序列由字符和跟隨其后的一個(gè)最多含有三位數(shù)字的八進(jìn)制數(shù)組成,如 33 或 033.十六進(jìn)制轉(zhuǎn)義序列由x和跟隨其后的一個(gè)十六進(jìn)制數(shù)組成,如x1b 或x1B.其中x必須小寫,不過十六進(jìn)制的數(shù)字不限大小寫。42轉(zhuǎn)義序列作為字符常量使用時(shí),轉(zhuǎn)義序列必須用一對(duì)單引號(hào)括起來。例如,一個(gè)表示成轉(zhuǎn)義字符的常量可以寫成33 (或 x1b).轉(zhuǎn)義序列可能有點(diǎn)隱晦,所以采用#define的方式給它們命名通常會(huì)是不錯(cuò)的主意:#define ESC 33轉(zhuǎn)義序列也

23、可以嵌入在字符串中使用。43字符處理函數(shù)大小寫轉(zhuǎn)換函數(shù):調(diào)用C語(yǔ)言的toupper庫(kù)函數(shù)是快捷、更易于移植的把小寫字母轉(zhuǎn)換成大寫字母的方法:ch = toupper(ch);toupper函數(shù)返回參數(shù)的大寫形式.程序調(diào)用toupper函數(shù)需要在頂部放置下面這條#include指令:#include C函數(shù)庫(kù)提供了其他有用的字符處理函數(shù)。44讀/寫字符轉(zhuǎn)換說明符%c允許scanf和printf函數(shù)對(duì)單獨(dú)一個(gè)字符進(jìn)行讀/寫操作:char ch;scanf(%c, &ch); /* reads one character */printf(%c, ch); /* writes one charact

24、er */scanf函數(shù)不會(huì)跳過空白字符。為了強(qiáng)制scanf函數(shù)在讀入字符前跳過空白字符,需要在格式串轉(zhuǎn)換說明%c前面加上一個(gè)空格:scanf( %c, &ch);45讀/寫字符因?yàn)橥ǔG闆r下scanf函數(shù)不會(huì)跳過空白,所以它很容易檢查到輸入行的結(jié)尾:檢查剛讀入的字符是否為換行符。下面的循環(huán)將讀入并且忽略掉所有當(dāng)前輸入行中其余的字符:do scanf(%c, &ch); while (ch != n);當(dāng)下次調(diào)用scanf函數(shù)時(shí),將讀入下一輸入行中的第一個(gè)字符。46讀/寫字符對(duì)單個(gè)字符的輸入和輸出,可以使用gechar函數(shù)和putchar函數(shù)來代替調(diào)用scanf函數(shù)和printf函數(shù)。putc

25、har函數(shù)寫單獨(dú)一個(gè)字符:putchar(ch);每次調(diào)用gechar函數(shù)將讀并返回一個(gè)字符:ch = getchar();getchar函數(shù)返回一個(gè)整數(shù)值而不是字符值。和scanf函數(shù)一樣,gechar函數(shù)也不會(huì)再讀取時(shí)跳過空白字符。47讀/寫字符使用gechar和puchar函數(shù)代替scanf和printf函數(shù)可以節(jié)約執(zhí)行時(shí)間。這兩個(gè)函數(shù)比scanf和printf函數(shù)簡(jiǎn)單,因?yàn)閟canf和printf函數(shù)是設(shè)計(jì)來讀寫多種不同格式的類型數(shù)據(jù)的。為了額外的速度提升,通常getchar函數(shù)和putchar函數(shù)是作為宏來實(shí)現(xiàn)的。getchar函數(shù)還有另一個(gè)優(yōu)點(diǎn),因?yàn)榉祷氐氖亲x入的字符,所以getc

26、har函數(shù)可以應(yīng)用在多種不同的C語(yǔ)言慣用法中。 48讀/寫字符思考下面這個(gè)scanf函數(shù)循環(huán),它用來跳過輸入行的剩余部分:do scanf(%c, &ch); while (ch != n);用getchar函數(shù)重寫上述循環(huán):do ch = getchar(); while (ch != n);49讀/寫字符為了精簡(jiǎn)循環(huán),運(yùn)行把gechar函數(shù)的調(diào)用放入到循環(huán)的控制表達(dá)式中:while (ch = getchar() != n) ;甚至變量ch都可以不需要,直接把getchar函數(shù)的返回值與換行符進(jìn)行比較:while (getchar() != n) ;50讀/寫字符getchar函數(shù)在用于循

27、環(huán)中搜尋字符時(shí)和跳過字符一樣有效。利用getchar函數(shù)跳過無限數(shù)量的空格字符:while (ch = getchar() = ) ;當(dāng)循環(huán)終止時(shí),變量ch將包含getchar函數(shù)遇到的第一個(gè)非空字符。51讀/寫字符當(dāng)混用getchar函數(shù)和scanf函數(shù)時(shí)要小心。scanf函數(shù)有一種留下后邊字符的趨勢(shì),即對(duì)于輸入后面的字符(包括換行符)只是看一下,并沒有讀入。printf(Enter an integer: );scanf(%d, &i);printf(Enter a command: );command = getchar();在讀入i的同時(shí),scanf函數(shù)調(diào)用將會(huì)留下后面沒有消耗掉的任意

28、字符,包括換行符(但不僅限于換行符)。getchar函數(shù)隨后將取回第一個(gè)剩余字符。52程序:確定消息的長(zhǎng)度程序length.c顯示用戶輸入消息的長(zhǎng)度:Enter a message: Brevity is the soul of wit.Your message was 27 character(s) long.消息的長(zhǎng)度包括空格和標(biāo)點(diǎn)符號(hào),但是不包含消息結(jié)尾處的換行符。我們即可以采用scanf函數(shù)也可以采用getchar函數(shù)讀取字符,但大多數(shù)C程序員愿意采用getchar函數(shù)。length2.c 是更短的程序去掉了用于存儲(chǔ)getchar函數(shù)讀入字符的變量。53length.c/* Deter

29、mines the length of a message */#include int main(void) char ch; int len = 0; printf(Enter a message: ); ch = getchar(); while (ch != n) len+; ch = getchar(); printf(Your message was %d character(s) long.n, len); return 0;54length2.c/* Determines the length of a message */#include int main(void) int

30、 len = 0; printf(Enter a message: ); while (getchar() != n) len+; printf(Your message was %d character(s) long.n, len); return 0;557.4 sizeof運(yùn)算符確定存儲(chǔ)指定類型值所需空間的大小。sizeof ( type-name )值是無符號(hào)整數(shù),表示存儲(chǔ)屬于類型名的值所需要的字節(jié)數(shù)。sizeof(char) 始終為1,但是對(duì)其他類型計(jì)算出的值可能會(huì)有所不同。在大多數(shù)32位機(jī)器上,表達(dá)式sizeof(int)的值為4。567.4 sizeof運(yùn)算符sizeof運(yùn)算符

31、也可以應(yīng)用常量、變量和表達(dá)式。 如果i和j是整型變量,那么sizeof(i)在32位機(jī)器上是4,和表達(dá)式sizeof(i + j)的值一樣。 與應(yīng)用于類型時(shí)相反,當(dāng)應(yīng)用于表達(dá)式時(shí)sizeof不要求圓括號(hào)??梢杂胹izeof i 代替sizeof(i)。 由于運(yùn)算符優(yōu)先級(jí)的問題,圓括號(hào)可能還是會(huì)需要的。編譯器會(huì)把sizeof i + j解釋為(sizeof i) + j, 因?yàn)閟izeof作為一元運(yùn)算符的優(yōu)先級(jí)高于二元運(yùn)算符+。577.4 sizeof運(yùn)算符顯示sizeof的值時(shí)要注意,因?yàn)閟izeof表達(dá)式的類型是由實(shí)現(xiàn)定義的。587.5 類型轉(zhuǎn)換為了讓計(jì)算機(jī)執(zhí)行算術(shù)運(yùn)算,通常要求操作數(shù)具有相

32、同大小(即具有相同的位數(shù)),并且要求存儲(chǔ)的方式也相同。當(dāng)不同類型的操作數(shù)混合在同一表達(dá)式中時(shí),C編譯器可能需要生成一些指令將某些操作數(shù)轉(zhuǎn)化成不同類型,使得硬件可以對(duì)表達(dá)式進(jìn)行計(jì)算。如果對(duì)16位int型數(shù)和32位long int型數(shù)進(jìn)行加法操作,編譯器將把16位int型操作數(shù)轉(zhuǎn)化成32位如果int型數(shù)和float型數(shù)相加,編譯器會(huì)將int型數(shù)轉(zhuǎn)換為float格式。597.5 類型轉(zhuǎn)換因?yàn)榫幾g器可以自動(dòng)處理這些轉(zhuǎn)換而無需程序員介入,所以這類轉(zhuǎn)換稱為隱式轉(zhuǎn)換。C語(yǔ)言還允許程序員通過使用強(qiáng)制運(yùn)算符執(zhí)行顯示轉(zhuǎn)換。執(zhí)行隱式轉(zhuǎn)換的規(guī)則有些復(fù)雜,因?yàn)镃語(yǔ)言有大量不同的基本數(shù)據(jù)類型。607.5 類型轉(zhuǎn)換當(dāng)發(fā)生下

33、列情況時(shí)會(huì)進(jìn)行隱式轉(zhuǎn)換:當(dāng)算術(shù)表達(dá)式或邏輯表達(dá)式中操作數(shù)的類型不相同時(shí)。(C語(yǔ)言執(zhí)行所謂的常用算術(shù)轉(zhuǎn)換)當(dāng)賦值運(yùn)算符右側(cè)表達(dá)式的類型和左側(cè)變量的類型不匹配時(shí)。當(dāng)函數(shù)調(diào)用中使用的參數(shù)類型于其對(duì)應(yīng)的參數(shù)的類型不匹配時(shí)。當(dāng)return語(yǔ)句中表達(dá)式的類型和函數(shù)返回值的類型不匹配時(shí)。61將在第9章進(jìn)行介紹。常用算術(shù)轉(zhuǎn)換常用算術(shù)轉(zhuǎn)換多用于二元運(yùn)算符的操作數(shù)上。如果變量x是float型的,變量i是int型的,常用算術(shù)轉(zhuǎn)換將會(huì)應(yīng)用在表達(dá)式x + i。顯然把變量i轉(zhuǎn)換成float型(匹配變量x的類型)比把變量x轉(zhuǎn)換成int型(匹配變量i的類型)更安全。當(dāng)一個(gè)整數(shù)被轉(zhuǎn)換成float類型,可能會(huì)發(fā)生的最糟糕的事是精

34、度會(huì)有少量的損失。相反,把浮點(diǎn)數(shù)轉(zhuǎn)化成int類型,將有小數(shù)部分的損失;更糟糕的是,如果原始數(shù)大于最大可能的整數(shù)或者小于最小的整數(shù),那么將會(huì)得到一個(gè)完全沒有意義的結(jié)果。62常用算術(shù)轉(zhuǎn)換常用算術(shù)轉(zhuǎn)換的策略是把操作數(shù)轉(zhuǎn)換成可以安全的適用于兩個(gè)數(shù)值的“最狹小的”數(shù)據(jù)類型。為了統(tǒng)一操作數(shù)的類型,通??梢詫⑾鄬?duì)較狹小類型的操作數(shù)轉(zhuǎn)換成另一個(gè)操作數(shù)的類型來實(shí)現(xiàn)(即所謂的提升)。最常用的提升是整型提升,它把字符或短整型轉(zhuǎn)換成int類型(或者某些情況下是unsigned int類型)。執(zhí)行常用的算術(shù)轉(zhuǎn)換的規(guī)則時(shí)可以劃分成兩種情況:任一操作數(shù)的類型是浮點(diǎn)型的情況。 兩個(gè)操作數(shù)的類型都不是浮點(diǎn)型的情況。63常用算術(shù)

35、轉(zhuǎn)換任一操作數(shù)的類型是浮點(diǎn)數(shù)的情況。如果一個(gè)操作數(shù)的類型為long double,那么把另一個(gè)操作數(shù)的類型轉(zhuǎn)換成long double類型。否則,如果一個(gè)操作數(shù)的類型為double類型,那么把另一個(gè)操作數(shù)轉(zhuǎn)換成double類型。否則,如果一個(gè)操作數(shù)的類型是float,那么把另一個(gè)操作數(shù)轉(zhuǎn)換成float例如: 如果一個(gè)操作數(shù)的類型是long int類型,并且另一個(gè)操作數(shù)的類型是double類型,那么把long int類型的操作數(shù)轉(zhuǎn)換成double類型。64常用算術(shù)轉(zhuǎn)換兩個(gè)操作數(shù)都不是浮點(diǎn)數(shù)的情況。按照下圖對(duì)類型狹小的操作數(shù)的類型進(jìn)行提升:unsigned long intlong intunsi

36、gned intint65常用算術(shù)轉(zhuǎn)換當(dāng)把有符號(hào)操作數(shù)和無符號(hào)操作數(shù)整合時(shí),會(huì)通過把符號(hào)位看成數(shù)的位的方法,將有符號(hào)數(shù)被轉(zhuǎn)換成無符號(hào)數(shù)。這條規(guī)則可能會(huì)導(dǎo)致某些隱蔽的編程錯(cuò)誤。最好盡量避免使用無符號(hào)整數(shù),特別是不要把它和有符號(hào)整數(shù)混合使用。66常用算術(shù)轉(zhuǎn)換常用算術(shù)轉(zhuǎn)換的示例:char c;short int s;int i;unsigned int u;long int l;unsigned long int ul;float f;double d;long double ld;i = i + c; /* c is converted to int */i = i + s; /* s is co

37、nverted to int */u = u + i; /* i is converted to unsigned int */l = l + u; /* u is converted to long int */ul = ul + l; /* l is converted to unsigned long int */f = f + ul; /* ul is converted to float */d = d + f; /* f is converted to double */ld = ld + d; /* d is converted to long double */67賦值中的轉(zhuǎn)換

38、常用算術(shù)轉(zhuǎn)換不適用于賦值運(yùn)算。賦值運(yùn)算使用代替法,即賦值運(yùn)算右邊的表達(dá)式結(jié)果轉(zhuǎn)換成左邊變量的類型:char c;int i;float f;double d;i = c; /* c is converted to int */f = i; /* i is converted to float */d = f; /* f is converted to double */68賦值中的轉(zhuǎn)換把浮點(diǎn)數(shù)賦值給整型變量會(huì)去掉該數(shù)的小數(shù)部分。int i;i = 842.97; /* i is now 842 */i = -842.97; /* i is now -842 */如果取值在變量類型范圍之外,那么

39、把值賦給一個(gè)較狹小類型的變量將會(huì)得到無意義的結(jié)果(甚至更糟):c = 10000; /* WRONG */i = 1.0e20; /* WRONG */f = 1.0e100; /* WRONG */69賦值中的轉(zhuǎn)換如果將一個(gè)浮點(diǎn)常量賦值給一個(gè)浮點(diǎn)變量,最好在該浮點(diǎn)常量后附加一個(gè)后綴f:f = 3.14159f;如果沒有后綴,浮點(diǎn)常量3.14159將為double類型,可能會(huì)引起警告信息。70強(qiáng)制類型轉(zhuǎn)換雖然C語(yǔ)言的隱式轉(zhuǎn)換使用起來非常方便,但是有些時(shí)候會(huì)需要更大程度的控制類型轉(zhuǎn)換。 基于這種原因,C語(yǔ)言提供了強(qiáng)制類型轉(zhuǎn)換。強(qiáng)制類型轉(zhuǎn)換表達(dá)式格式如下:( 類型名 ) 表達(dá)式類型名表示的是表達(dá)式

40、應(yīng)該轉(zhuǎn)換成的類型。71強(qiáng)制類型轉(zhuǎn)換使用強(qiáng)制類型轉(zhuǎn)換表達(dá)式計(jì)算機(jī)float型值小數(shù)部分的方法:float f, frac_part;frac_part = f - (int) f;f和(int)f的不同就是在f的小數(shù)部分在強(qiáng)制類型轉(zhuǎn)換時(shí)被丟失了。強(qiáng)制類型轉(zhuǎn)換表達(dá)式可以被用來顯示哪些肯定會(huì)發(fā)生的類型轉(zhuǎn)換:i = (int) f; /* f is converted to int */72強(qiáng)制類型轉(zhuǎn)換強(qiáng)制類型轉(zhuǎn)換也可以用來控制編譯器,強(qiáng)制其進(jìn)行執(zhí)行轉(zhuǎn)換。例子:float quotient;int dividend, divisor;quotient = dividend / divisor;為了避免在除法運(yùn)算產(chǎn)生截?cái)嘈?shù)部分,我們需要強(qiáng)制轉(zhuǎn)換其中一個(gè)操作數(shù):quotient = (float) dividend / divisor;強(qiáng)制轉(zhuǎn)換變量divide

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論