C的基本數(shù)據(jù)類型及運(yùn)算_第1頁(yè)
C的基本數(shù)據(jù)類型及運(yùn)算_第2頁(yè)
C的基本數(shù)據(jù)類型及運(yùn)算_第3頁(yè)
C的基本數(shù)據(jù)類型及運(yùn)算_第4頁(yè)
C的基本數(shù)據(jù)類型及運(yùn)算_第5頁(yè)
已閱讀5頁(yè),還剩89頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

2.1標(biāo)識(shí)符正確不正確count1counttest123hi!thereHigh-balancehigh..balancePIa+b

說(shuō)明:

(1)與有些程序設(shè)計(jì)語(yǔ)言的規(guī)定不同,在C語(yǔ)言中,標(biāo)識(shí)符中大小寫(xiě)字母是有區(qū)別的。程序中基本上都采用小寫(xiě)字母表示各種標(biāo)識(shí)符,如變量名、數(shù)組名、函數(shù)名等。書(shū)寫(xiě)的各種語(yǔ)句也均用小寫(xiě)字母,而大寫(xiě)字母只用來(lái)定義宏名等,用的不多。(2)不同的系統(tǒng)對(duì)標(biāo)識(shí)符的長(zhǎng)度有不同的要求,有的要求為6個(gè)字符,有的允許使用8個(gè)字符,而TurboC系統(tǒng)下的有效長(zhǎng)度為1至32個(gè)字符。

(3)除了少數(shù)工作單元我們用單個(gè)字符作標(biāo)識(shí)符,一般的應(yīng)做到見(jiàn)名知意,以提高程序的可讀性。如用sum表示和,score表示成績(jī),max表示最大等等。2.1.2關(guān)鍵字ANSIC規(guī)定了32個(gè)關(guān)鍵字(保留字),不能再用作各種標(biāo)識(shí)符。下面列出32個(gè)關(guān)鍵字:auto,break,case,char,const,continue,default,do,double,else,enum,extern,float,for,goto,if,int,long,register,return,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile,while。它們用來(lái)表示C語(yǔ)言本身的特定成份,具有相應(yīng)的語(yǔ)義,可構(gòu)成所有的C語(yǔ)言語(yǔ)句。

C語(yǔ)言還使用下列12個(gè)標(biāo)識(shí)符作為編譯預(yù)處理的命令單詞,但使用時(shí)前面應(yīng)加“?!保篸efine,elif,else,endif,error,if,ifdef,ifndef,include,line,progma,undef。2.2數(shù)據(jù)類型2.2.1基本數(shù)據(jù)類型1.基本數(shù)據(jù)類型表2.1C基本數(shù)據(jù)類型的長(zhǎng)度和值域

字符型(char)變量用于存貯ASCII碼字符,也可存貯8位二進(jìn)制數(shù)。整型(int)變量用于存貯整數(shù)。因其字長(zhǎng)有限,故可表示的整數(shù)的范圍也有限。單精度實(shí)型(float)和雙精度實(shí)型(double)變量用于存貯實(shí)數(shù),實(shí)數(shù)具有整數(shù)和小數(shù)兩部分或是帶指數(shù)的數(shù)據(jù)。表中的值域用絕對(duì)值表示。無(wú)值型(void)有兩種用途:第一是明確地表示一個(gè)函數(shù)不返回任何值;第二是產(chǎn)生同一類型的指針。

2.類型修飾符除了無(wú)值類型外,基本數(shù)據(jù)類型可以帶有各種修飾前綴。修飾符用于明確基本數(shù)據(jù)類型的含義,以準(zhǔn)確地適應(yīng)不同情況下的要求。類型修飾符種類如下:signed 有符號(hào)unsigned 無(wú)符號(hào)long 長(zhǎng)Short 短表2.2C基本類型及其修飾符的所有組合

不同的計(jì)算機(jī)系統(tǒng)對(duì)各類數(shù)據(jù)所占內(nèi)存字節(jié)數(shù)有不同的規(guī)定,如int型有的系統(tǒng)占16位,有的占32位。longdouble型有的占128位,有的占64位。有符號(hào)(signed)和無(wú)符號(hào)(unsigned)的整型量的區(qū)別在于它們的最高位的定義不同。如果定義的是有符號(hào)的整型(signedint),C編譯程序所產(chǎn)生的代碼就設(shè)定整型數(shù)的最高位為符號(hào)位,其余位表示數(shù)值大小。如最高位為0,則該整數(shù)為正;如最高位為1,則該整數(shù)為負(fù)。例如用8位二進(jìn)制表示時(shí):

大部分計(jì)算機(jī)表示有符號(hào)數(shù)時(shí)都使用二進(jìn)制補(bǔ)碼。原因及細(xì)節(jié)將在微機(jī)原理課上學(xué)習(xí)。補(bǔ)碼的求法很簡(jiǎn)單:正數(shù)補(bǔ)碼即原碼;負(fù)數(shù)的補(bǔ)碼是將其對(duì)應(yīng)原碼的各位(除符號(hào)位外)按位求反,然后加1。上述四個(gè)數(shù)用8位二進(jìn)制表示有符號(hào)數(shù)時(shí)機(jī)內(nèi)補(bǔ)碼值為:

有符號(hào)整數(shù)對(duì)于許多運(yùn)算都是很重要的。但是它所能表達(dá)的最大數(shù)的絕對(duì)值只是無(wú)符號(hào)數(shù)的一半。例如,32767的有符號(hào)整數(shù)表示為:

0111111111111111

如果最高位設(shè)置為1,則該數(shù)就會(huì)被當(dāng)作-1。然而,如將該數(shù)定義為無(wú)符號(hào)整型(unsignedint),那么當(dāng)最高位設(shè)置為1時(shí),它就變成了65535。3.訪問(wèn)修飾符

C語(yǔ)言有兩個(gè)用于控制訪問(wèn)和修改變量方式的修飾符,它們分別是常量(const)和易變量(volatile)。帶const修飾符定義出的常量在程序運(yùn)行過(guò)程中始終保持不變。例如:

constintnum;將產(chǎn)生整型常量num,其值不能被程序所修改,但可以在其它類型的表達(dá)式中使用。const型量可以在其初始化時(shí)直接被賦值,或通過(guò)某些硬件的方法賦值,例如num要定義成100,可寫(xiě)成:

constintnum=100;以后程序中出現(xiàn)num的地方就是100,也不能再被改變。volatile修飾符用于提醒編譯程序,該變量的值可以不通過(guò)程序中明確定義的方法來(lái)改變。例如一個(gè)全程變量用于存貯系統(tǒng)的實(shí)時(shí)時(shí)鐘值,在這種情況下,變量的內(nèi)容在程序中沒(méi)有明確的賦值語(yǔ)句對(duì)它賦值時(shí),也會(huì)發(fā)生改變。這一點(diǎn)是很重要的,因?yàn)樵诩俣ū磉_(dá)式內(nèi)變量?jī)?nèi)容不變的前提下,C編譯程序會(huì)自動(dòng)地優(yōu)化某些表達(dá)式,有的優(yōu)化處理將會(huì)改變表達(dá)式的求值順序。修飾符volatile就可以防止上述情況發(fā)生。

const和volatile可以同時(shí)使用。例如,假設(shè)0x30是一個(gè)只隨外部條件而變化的口地址值,那么就恰好需要用下述說(shuō)明來(lái)避免偶然因素所產(chǎn)生的副作用的影響。

constvolatileunsignedchar*port=0x30;2.2.2構(gòu)造數(shù)據(jù)類型

數(shù)組是一組連續(xù)、有序的存放在一起的具有相同類型的數(shù)據(jù)。結(jié)構(gòu)體是將不同類型的數(shù)據(jù)按一定順序存放在一起的數(shù)據(jù)結(jié)構(gòu)。共用體是將不同類型的數(shù)據(jù)都存放在同一起始地址的內(nèi)存單元中,共用一段內(nèi)存以節(jié)省內(nèi)存單元。枚舉是只有幾種可能的值,將其一一列舉出來(lái)。實(shí)際是用符號(hào)來(lái)表示若干個(gè)可取的整型值,它是整型的一個(gè)子集。2.2.3指針類型

指針是C語(yǔ)言中一個(gè)重要概念。正確而靈活地運(yùn)用它,可以有效地表示復(fù)雜的數(shù)據(jù)結(jié)構(gòu);能動(dòng)態(tài)分配內(nèi)存;能方便地使用字符串;有效而方便地使用數(shù)組;在調(diào)用函數(shù)時(shí)能得到多于一個(gè)的值;能直接處理內(nèi)存地址等。指針類型迥異于前述各種數(shù)據(jù)類型,不管是簡(jiǎn)單類型的數(shù)據(jù),還是構(gòu)造類型數(shù)據(jù),均是代表數(shù)據(jù)的,而指針類型是代表地址的。2.3常量2.3.1數(shù)值常量1.整型常量

整型常量也稱為整型常數(shù)或整數(shù)。

C整型常量按進(jìn)制分可分為十進(jìn)制整數(shù),八進(jìn)制整數(shù)和十六進(jìn)制整數(shù)。

1)十進(jìn)制整數(shù)十進(jìn)制整數(shù)以正負(fù)號(hào)開(kāi)頭,后跟0~9的若干位數(shù)字構(gòu)成。如123,-456,0等。2)八進(jìn)制整數(shù)八進(jìn)制整數(shù)是以正負(fù)號(hào)開(kāi)頭,第一位數(shù)字一定是0,后面跟0~7的數(shù)字。如八進(jìn)制數(shù)0123,相當(dāng)于十進(jìn)制數(shù)83;八進(jìn)制數(shù)-012,相當(dāng)于十進(jìn)制數(shù)-10。八進(jìn)制數(shù)與十進(jìn)制數(shù)的轉(zhuǎn)換,方法如下:

0123=1×8

2+2×8

1+3×8

0=64+16+3=833)十六進(jìn)制整數(shù)十六進(jìn)制整數(shù)是以正負(fù)號(hào)開(kāi)頭,前兩位為0x,后面跟0~9和a~f的數(shù)字。其中a代表10,b代表11,其余類推。如十六進(jìn)制數(shù)0x123,相當(dāng)于十進(jìn)制數(shù)291;十六進(jìn)制數(shù)-0x12,相當(dāng)于十進(jìn)制數(shù)-18。十六進(jìn)制數(shù)轉(zhuǎn)換成十進(jìn)制數(shù),方法如下:

0x123=1×16

2+2×16

1+3×16

0=256+32+3=291

0x1ab=1×16

2+10×16

1+11×16

0=256+160+11=4274)二進(jìn)制數(shù),字節(jié),字,位計(jì)算機(jī)內(nèi)所有的信息均用二進(jìn)制表示,即計(jì)算機(jī)內(nèi)只有0和1,也只認(rèn)識(shí)由0和1組成的程序或數(shù)據(jù)。為什么在計(jì)算機(jī)中要使用二進(jìn)制數(shù)呢?因?yàn)槎M(jìn)制數(shù)運(yùn)算規(guī)則簡(jiǎn)單,用物理器材容易實(shí)現(xiàn),如電壓的高與低,開(kāi)關(guān)的開(kāi)與關(guān),脈沖的有與無(wú)等等。一個(gè)二進(jìn)制數(shù)0或1,稱為“位”(bit)。在計(jì)算機(jī)存貯器中,為了便于管理,常將8個(gè)位稱為一個(gè)“字節(jié)”(byte),每個(gè)字節(jié)存放在一個(gè)存貯單元中,每個(gè)單元賦于一個(gè)存貯地址。計(jì)算機(jī)在處理數(shù)據(jù)時(shí),每一個(gè)數(shù)據(jù)是一個(gè)“字”(word),字是由若干字節(jié)組成。字可以是1個(gè)字節(jié)(字符),2個(gè)字節(jié)(整數(shù)),4個(gè)字節(jié)(實(shí)數(shù),長(zhǎng)整型數(shù)),8個(gè)字節(jié)(雙精度實(shí)數(shù))等等。

2.單精度實(shí)型常量1)小數(shù)形式一個(gè)實(shí)數(shù)可以是正負(fù)號(hào)開(kāi)頭,有若干位0~9的整數(shù),后跟一個(gè)小數(shù)點(diǎn)(必須有),再有若干位小數(shù)部分。如123.456,-21.37。數(shù)12用實(shí)數(shù)表示必須寫(xiě)成12.0或12.。一個(gè)實(shí)數(shù)有數(shù)值范圍和有效位數(shù)的限制。實(shí)數(shù)的數(shù)值范圍是3.4×10-38≤|x|≤3.4×1038,當(dāng)小于3.4×10-38時(shí)按0對(duì)待(下溢),而大于3.4×1038時(shí)則上溢,一個(gè)溢出的數(shù)是無(wú)意義的。實(shí)數(shù)僅有7位有效數(shù)字,超過(guò)七位的將是不精確的。如1.2345678,在計(jì)算機(jī)內(nèi)僅保留為1.234567,第八位數(shù)無(wú)法保留而失去,并不是第八位向第七位四舍五入。當(dāng)上面的數(shù)要求用小數(shù)五位表示時(shí),則表達(dá)為1.23457,即第七位向第六位四舍五入。2)指數(shù)形式實(shí)數(shù)的指數(shù)形式也稱為科學(xué)計(jì)數(shù)法。一個(gè)實(shí)數(shù)的指數(shù)形式分成尾數(shù)部分和指數(shù)部分。尾數(shù)部分可以是整數(shù)形式或小數(shù)形式,指數(shù)部分是一個(gè)字母“e”后跟一個(gè)整數(shù)。如123e+01,-456.78e-01,0e0等。由于實(shí)數(shù)僅有7位有效數(shù)字,因此在內(nèi)存中用三個(gè)字節(jié)來(lái)表示尾數(shù),用一個(gè)字節(jié)來(lái)表示指數(shù),所以指數(shù)部分用兩位整數(shù)來(lái)表示。在書(shū)寫(xiě)時(shí)“e”與“E”完全等價(jià)?!癳”前面必須有數(shù)字,“e”后面必須是整數(shù)。3.雙精度常量

當(dāng)一個(gè)數(shù)用實(shí)數(shù)表達(dá)時(shí),僅有七位有效數(shù)字,用長(zhǎng)整型表達(dá)時(shí)僅有十位有效數(shù)字,實(shí)數(shù)的數(shù)值范圍也只能小于3.4×1038。當(dāng)超過(guò)以上范圍時(shí),我們可以用雙精度常量來(lái)表達(dá)。雙精度常量的取值范圍由1.7×10-308≤|x|≤1.7×10308,有效位可達(dá)16位左右。一個(gè)數(shù)當(dāng)超過(guò)長(zhǎng)整型數(shù)表達(dá)范圍或超過(guò)實(shí)數(shù)表達(dá)范圍時(shí)均按雙精度常量對(duì)待。一個(gè)雙精度常量在內(nèi)存中占8個(gè)字節(jié)。長(zhǎng)雙精度常量取值范圍在10-4931~104932之間,有19位有效數(shù)字,在內(nèi)存中占16個(gè)字節(jié)。但它是由計(jì)算機(jī)系統(tǒng)決定的,在TurboC中,與double型一致。2.3.2字符常量表2.3控制字符表示法2.3.3字符串常量2.3.4符號(hào)常量1.不帶參數(shù)的宏定義宏定義命令#define用來(lái)定義一個(gè)標(biāo)識(shí)符和一個(gè)字符串,在程序中每次遇到該標(biāo)識(shí)符時(shí)就用所定義的字符串替換它。這個(gè)標(biāo)識(shí)符叫做宏名,替換過(guò)程叫做宏替換或宏展開(kāi)。宏定義命令#define的一般形式是:#define宏名字符串

例如你想用PI表示數(shù)值3.14159,可以用宏定義#define來(lái)說(shuō)明:#definePI3.14159

這樣在編譯時(shí),每當(dāng)在源程序中遇到PI就自動(dòng)用3.14159代替,這就是宏展開(kāi)。若定義了一個(gè)宏名,這個(gè)名字還可以做為其它宏定義的一個(gè)部分來(lái)使用。例如:#definePI3.14159

#definePI22*PI

則在程序中出現(xiàn)的“PI2”處被“2*3.14159”來(lái)替換。

應(yīng)注意宏替換僅是簡(jiǎn)單地用所說(shuō)明的字符串來(lái)替換對(duì)應(yīng)的宏名,無(wú)實(shí)際的運(yùn)算發(fā)生,也不作語(yǔ)法檢查。例如:#definePI3.14159;

area=PI*r*r;經(jīng)過(guò)宏替換后,該語(yǔ)句展開(kāi)為

area=3.14159;*r*r;然后經(jīng)編譯將出現(xiàn)語(yǔ)法錯(cuò)誤。在C語(yǔ)言程序中習(xí)慣上用大寫(xiě)字母作為宏名。#undef宏名來(lái)終止其作用域。例如:#definePI3.14159

main()

{…

}

#undefPI

f1()

…例2.1

宏定義的使用。程序:

#defineR3.0

#definePI3.1415926

#defineL2*PI*R

#defineSPI*R*R

main()

{printf(″L=%f\nS=%f\n″,L,S);

}

運(yùn)行情況如下:L=18.849556

S=28.274333

經(jīng)過(guò)宏展開(kāi)后,printf函數(shù)調(diào)用語(yǔ)句被展開(kāi)為:printf(″L=%f\nS=%f\n″,2*3.1415926*3.0,3.1415926*3.0*3.0);而在雙引號(hào)內(nèi)的L,S將不被替換,即字符串內(nèi)與宏名相同的部分將不替換。2.帶參數(shù)的宏定義

它不是進(jìn)行簡(jiǎn)單的字符串替換,還要進(jìn)行參數(shù)替換。其定義的一般形式為:#define宏名(參數(shù)表)字符串其中字符串中包括參數(shù)表中所指定的參數(shù)。在使用時(shí),要將程序中宏名后的實(shí)際參數(shù)代入字符串中參數(shù)的位置。例如:#defineS(a,b)a*b

area=S(3,2);經(jīng)編譯預(yù)處理,該語(yǔ)句被展開(kāi)成

area=3*2;

說(shuō)明:

(1)宏名和參數(shù)表左括號(hào)之間不能有空格,否則按不帶參宏替換了。

(2)字符串中應(yīng)注意括號(hào)的使用,以保證運(yùn)算次序。如上例改成

area=S(1+2,2); 經(jīng)展開(kāi)后變成

area=1+2*2; 這就不合我們的要求了。此時(shí),可改寫(xiě)成 #defineS(a,b)(a)*(b)

area=S(1+2,2)

經(jīng)展開(kāi)后變成

area=(1+2)*(2); 就不會(huì)出現(xiàn)錯(cuò)誤了。2.4變量2.4.1變量的定義1.變量定義變量定義的一般形式如下:類型變量名表;這里,類型(type)必須是C語(yǔ)言的有效數(shù)據(jù)類型。變量名表可以是一個(gè)或多個(gè)標(biāo)識(shí)符名,中間用逗號(hào)分隔,最后以分號(hào)結(jié)束。以下是一些變量定義的例子:

inti,j,num;

floata,b,sum;

unsignedintui;

charc,ch,name;

doublex,total;2.說(shuō)明

(1)變量名可以是C語(yǔ)言中允許的合法標(biāo)識(shí)符,用戶定義時(shí)應(yīng)遵循“見(jiàn)名知意”的原則,以利于程序的維護(hù)(今后所有標(biāo)識(shí)符均如此,不再重復(fù))。

(2)每一個(gè)變量都必須進(jìn)行類型說(shuō)明,這樣就可以保證程序中變量的正確使用。未經(jīng)類型說(shuō)明的變量在編譯時(shí)將被指出是錯(cuò)誤的,也就是變量要先定義,后使用。

(3)當(dāng)一個(gè)變量被指定為某一確定類型時(shí),將為它分配若干相應(yīng)字節(jié)的內(nèi)存空間。如char型為1字節(jié),int型為2字節(jié),float為4字節(jié),double為8字節(jié)。當(dāng)然,不同的系統(tǒng)可能稍有差異。(4)變量可以在程序內(nèi)的三個(gè)地方定義:在函數(shù)內(nèi)部,在函數(shù)的參數(shù)(形參)定義中或在所有的函數(shù)外部。由此定義的變量分別稱為局部變量,形式參數(shù)和全局變量。在不同地方定義的變量,其作用范圍不同。在同一層次定義的變量,不能與數(shù)組、指針、函數(shù)和其它變量同名。

(5)變量是用來(lái)存放數(shù)據(jù)的,由于數(shù)據(jù)有不同的類型,因此要定義相應(yīng)類型的變量去存放它。這些數(shù)據(jù)稱為相應(yīng)變量的值。2.4.2C語(yǔ)言中各種類型的變量1.整型變量整型變量用來(lái)存放整型數(shù)值。整型變量可分為:基本型(int),短整型(shortint或short),長(zhǎng)整型(longint或long)和無(wú)符號(hào)型(unsignedint,unsignedshort,unsignedlong)。前三種整型變量存貯單元的最高位為符號(hào)位。0表示為正,1表示為負(fù)。無(wú)符號(hào)型變量存貯單元的所有位均表示數(shù)值。具體可參看表2.2。在使用整型變量時(shí)一定要注意數(shù)值的范圍,超過(guò)該變量允許的使用范圍將導(dǎo)致錯(cuò)誤的結(jié)果。2.實(shí)型變量實(shí)型變量分為單精度型(float)和雙精度型(double)兩類。其存放數(shù)據(jù)的差別是:?jiǎn)尉茸兞空?個(gè)字節(jié)內(nèi)存單元,有7位有效數(shù)字,數(shù)值范圍在3.4e-38~3.4e+38之間。而雙精度變量占有8個(gè)字節(jié)內(nèi)存單元,有15~16位有效數(shù)字,數(shù)值范圍在1.7e-308~1.7e+308之間。3.字符型變量字符型(char)變量?jī)?nèi)存放字符型常量,在內(nèi)存單元中僅占一個(gè)字節(jié)。其內(nèi)存中存放的是該字符的ASCII碼,因此字符型變量也可存貯數(shù)值范圍為0~255或-128~127之間的整型常數(shù)。

在C語(yǔ)言中,字符型與整型的界限不是很分明的,在一個(gè)字節(jié)內(nèi)是可互相轉(zhuǎn)換的。4.枚舉型變量

枚舉型是一個(gè)整型常量的集合。這些常量指定了所有該類型變量可能具有的各種合法值。枚舉在我們?nèi)粘I钪惺殖R?jiàn)。例如,星期的枚舉為:{星期日,星期一,星期二,星期三,星期四,星期五,星期六}。枚舉的定義形式是:

enum

〈枚舉類型名〉{枚舉元素表}〈變量表〉;

其中枚舉類型名和枚舉變量表是選擇項(xiàng)。下面我們來(lái)看一個(gè)枚舉類型的定義和變量定義的例子:

enumweekday{sun,mon,tue,wed,thu,fri,sat};

enumweekdayworkday,restday;

其中第一句是定義枚舉類型enumweekday,weekday是枚舉類型名,而花括號(hào)內(nèi)是該枚舉型變量可能具有的各種情況的一一列舉。第二句是定義枚舉型變量,即變量workday,restday是屬于enumweekday枚舉類型的,該枚舉型變量只能賦予花括號(hào)內(nèi)的常量,例如:

workday=mon;

restday=sun;

枚舉類型的定義和變量的定義有三種形式:(1)上面舉例即是,即枚舉類型和枚舉變量是分別定義的。(2)可將上述形式合并成一句:enumweekday{sun,mon,tue,wed,thu,fri,sat}workdayrestday;

(3)當(dāng)只有一種枚舉類型時(shí),可省略枚舉類型名:enum{sun,mon,tue,wed,thu,fri,sat}workday,restday;

具體的枚舉元素對(duì)應(yīng)的整數(shù)由兩種情況決定:

(1)缺?。寒?dāng)花括號(hào)內(nèi)的枚舉元素沒(méi)有被初始化,第一項(xiàng)代表整數(shù)0,第二項(xiàng)代表整數(shù)1,以此類推。

(2)初始化:我們可以用初始化來(lái)改變枚舉元素的相應(yīng)值。例如:enumweekday{mon=1,tue,wed,thu,fri,sat,sun}workday,restday;

在上句中,mon代表1,后面仍然自動(dòng)增1,即tue代表2,sat代表6,而sun在此不代表0而代表7。初值可以從任何一個(gè)整數(shù)開(kāi)始,也可以指定幾個(gè)初值,也可給任何一個(gè)枚舉常量賦初值。例如:

enumweekday{sun,mon,tue,wed=5,thu,fri,sat};

其中sun為0,mon為1,tue為2,wed為5,thu為6,fri為7,sat為8。下例也是正確的:

enumweekday{sun=7,mon=1,tue,wed,thu,fri,sat};此后sum為7,mon為1,tue為2,wed為3,thu為4,fri為5,sat為6。枚舉型變量值在輸出時(shí)是輸出其整常數(shù)而不是其枚舉元素的標(biāo)識(shí)符。枚舉型變量在賦值時(shí)可以賦枚舉元素而不能直接賦整型常量,如要賦整型常量,則要進(jìn)行類型轉(zhuǎn)換。例如:

restday=(enumweekday)6;或

restday=sat;例2.2

打印出枚舉元素sat的內(nèi)存值。程序:

main()

{enum{sun,mon,tue,wed,thu,fri,sat}workday,restday;

restday=sat;

printf(″restdayis%d\n″,restday);

}

運(yùn)行:restdayis6

5.其它類型變量

C語(yǔ)言中無(wú)字符串變量,但可以用字符數(shù)組或字符型指針來(lái)表達(dá)字符串。另外還有指針型變量,結(jié)構(gòu)體型變量,共用體型變量等,這些將在后續(xù)章節(jié)中介紹。

C語(yǔ)言中沒(méi)有邏輯型變量,所有非零數(shù)值被認(rèn)為是邏輯“真”,而數(shù)值零被認(rèn)為是邏輯“假”。無(wú)值型類型一般不用來(lái)說(shuō)明變量,只用在函數(shù)或指針中。2.4.3變量的初始化

程序中常需要對(duì)一些變量預(yù)先設(shè)置初值。C規(guī)定,可以在定義變量時(shí)同時(shí)使變量初始化。變量初始化只需定義變量時(shí)在變量名后面加一等號(hào)及一個(gè)常數(shù)。它的一般形式是:類型變量名=常數(shù);以下是幾個(gè)示例:

charch=′a′;

intfirst=0;

floatx=123.45;2.5運(yùn)算符(1)算術(shù)運(yùn)算符(+,-,*,/,%,++,--)。(2)關(guān)系運(yùn)算符(<,>,<=,>=,==,![KG-*8]=)。(3)邏輯運(yùn)算符(!,&&,||)。(4)位運(yùn)算符(<<,>>,~,|,^,&)。(5)賦值運(yùn)算符(=,及其雙目運(yùn)算符的擴(kuò)展賦值運(yùn)算符)。(6)條件運(yùn)算符(?:)。(7)逗號(hào)運(yùn)算符(,)。(8)指針運(yùn)算符(*,&)。(9)求字節(jié)數(shù)運(yùn)算符(sizeof)。(10)強(qiáng)制類型轉(zhuǎn)換運(yùn)算符((類型))。(11)分量運(yùn)算符(·,->)。(12)下標(biāo)運(yùn)算符([])。(13)圓括號(hào)運(yùn)算符(())。2.5.1算術(shù)運(yùn)算符和賦值運(yùn)算符表2.4算術(shù)運(yùn)算符和賦值運(yùn)算符

說(shuō)明:

(1)+,-,*,/與數(shù)學(xué)中運(yùn)算類似,先乘除后加減,也就是按優(yōu)先級(jí)順序進(jìn)行運(yùn)算,優(yōu)先級(jí)小的先運(yùn)算。要改變運(yùn)算順序只要加括號(hào)就可以了,括號(hào)全部為圓括號(hào),必須注意括號(hào)的配對(duì),它們適用于C的幾乎全部數(shù)據(jù)類型(指針類除外)的各種運(yùn)算(++,--除外)。除法運(yùn)算符(/)在用于兩個(gè)整型數(shù)據(jù)運(yùn)算時(shí),其運(yùn)算結(jié)果也是整數(shù),余數(shù)總是被截掉。如1/2的結(jié)果是0;10/3的結(jié)果是3。(2)求余運(yùn)算符(%)僅用于整型數(shù)據(jù),不能用于實(shí)型和雙精度實(shí)型。它的作用是取整數(shù)除法的余數(shù)。如1%2的結(jié)果是1;10%3的結(jié)果也是1。

(3)賦值運(yùn)算符(=)是將右邊表達(dá)式的值賦給左邊的變量。賦值運(yùn)算符左邊必須是變量等有存貯單元的元素,而不能是常量或表達(dá)式。如x=x+1是合法的,即把x的值加上1后再賦給x,而x+1=x卻是非法的,因?yàn)閤+1不是一個(gè)存貯單元,不能被賦以值。賦值號(hào)有別于數(shù)學(xué)中的等號(hào),這一點(diǎn)是要注意的。(4)++,--僅用于整型變量,指針變量。用于整型變量在原值上加1或減1;用于指針變量是取下一地址或上一地址。關(guān)于指針部分的使用在第八章中介紹。增1和減1運(yùn)算符用在表達(dá)式中時(shí),寫(xiě)法是有差別的:如果運(yùn)算符在操作數(shù)前面,則在表達(dá)式“引用”該操作數(shù)前,先對(duì)其作加1或減1運(yùn)算;如果運(yùn)算符在操作數(shù)之后,則先“引用”該操作數(shù),然后再對(duì)它作加1或減1運(yùn)算??紤]以下程序:main()

{intx,y;

x=10;

y=++x;

printf(″%d,%d\n″,x,y);

}

運(yùn)算結(jié)果為11,11

此時(shí)y的值和x的值都為11。然而換一種寫(xiě)法:

main()

{intx,y;

x=10;

y=x++;

printf(″%d,%d\n″,x,y);

}

運(yùn)行結(jié)果為11,10

此時(shí)y的值是10,而x的值自增后為11。上述兩種情況x都變成了11,而y的值卻不同。它們的差別只在于給x加1的時(shí)機(jī)不同。此時(shí)賦值即為引用。再如進(jìn)行輸出操作時(shí),有以下程序段:

x=10;

printf(″x=%d\n″,++x);

運(yùn)行結(jié)果為x=11,執(zhí)行其下一條語(yǔ)句時(shí)x也是11,而程序段:

x=10;

printf(″x=%d\n″,x++);(5)+,-,*,/,%可以與賦值號(hào)=組成復(fù)合賦值運(yùn)算符+=,-=,*=,/=,%=。如a=a+b可以寫(xiě)成a+=b,a=a*b可以寫(xiě)成a*=b。其余類推。這樣書(shū)寫(xiě)簡(jiǎn)練,運(yùn)行速度快,也提高了編譯效率。2.5.2關(guān)系運(yùn)算符和邏輯運(yùn)算符表2.5關(guān)系和邏輯運(yùn)算符

說(shuō)明:

(1)當(dāng)關(guān)系運(yùn)算符兩邊的值滿足關(guān)系時(shí)為真,返回1;如不滿足關(guān)系時(shí)為假,返回0。例如:x=10;

printf(″%d\n″,x>=9);

則輸出為1。又如:x=5;

printf(″%d\n″,x>=9);

則輸出為0。字符比較按其ASCII碼值進(jìn)行,如′A′<′B′為真。(2)關(guān)系運(yùn)算符>,>=,<,<=的優(yōu)先級(jí)相同,如在表達(dá)式中同時(shí)出現(xiàn)時(shí),則自左向右順序運(yùn)算。而==與!=則優(yōu)先級(jí)低于此四種關(guān)系運(yùn)算符。例如:

printf(″%d\n″,5>3>1);

運(yùn)行輸出結(jié)果為0。因?yàn)閮蓚€(gè)>是同一優(yōu)先級(jí),5>3的結(jié)果為1,而1>1的關(guān)系不滿足,所以最后結(jié)果為0。又如:printf(″%d\n″,1==11<35);

運(yùn)行輸出結(jié)果為1。因?yàn)?lt;的優(yōu)先級(jí)比==高,則11<35的結(jié)果為1,而1==1的關(guān)系滿足,所以最后結(jié)果為1。(3)邏輯運(yùn)算的真值表如下所示,邏輯值用1和0表示。pqp&&qp||q!p000 010101 1100 10111 10(4)關(guān)系和邏輯運(yùn)算符的優(yōu)先級(jí)都低于算術(shù)運(yùn)算符(邏輯非!除外)。如10>1+12完全等價(jià)于10>(1+12),其結(jié)果當(dāng)然是假(即0)。

(5)在關(guān)系和邏輯運(yùn)算符組成的表達(dá)式中,也可以像算術(shù)表達(dá)式一樣,用圓括號(hào)來(lái)改變運(yùn)算的自然優(yōu)先次序,如!1&&0其值為假,因?yàn)橄葓?zhí)行!1,然后才執(zhí)行&&。然而加上圓括號(hào)!(1&&0)后改變了運(yùn)算順序,則執(zhí)行!0操作結(jié)果為1,即其值為真。(6)在邏輯表達(dá)式的求解中,并不是所有的邏輯運(yùn)算符都被執(zhí)行,只是在必須執(zhí)行下一個(gè)邏輯運(yùn)算符才能求出表達(dá)式的值時(shí),才執(zhí)行該運(yùn)算符。例如:當(dāng)兩個(gè)邏輯量a||b時(shí),當(dāng)a為真時(shí)則不再求b的值,而取值為真(即1)。當(dāng)兩個(gè)邏輯量a&&b時(shí),當(dāng)a為假,則同樣不再求b的值,而取值為假(即0)。同理,a||b||c式中當(dāng)a為真時(shí),直接取值為真(即1);a&&b&&c式中當(dāng)a為假時(shí),直接取值為假(即0)。此時(shí)若b,c為賦值表達(dá)式,則賦值操作就沒(méi)有進(jìn)行。

(7)邏輯運(yùn)算的轉(zhuǎn)換。

!(a||b)可寫(xiě)成!a&&!b,而!(a&&b)可寫(xiě)成!a||!b。2.5.3位運(yùn)算符表2.6位運(yùn)算符

說(shuō)明:

(1)位邏輯運(yùn)算符&(與AND),|(或OR),^(異或XOR),~(反NOT)的真值表如下:

PQP&QP|QP^Q~P 000001 010 111 100110 111100

真值表似乎與邏輯運(yùn)算符&&,||,!類似,實(shí)質(zhì)上運(yùn)算中的對(duì)象是不同的。上述真值表中的P,Q是一個(gè)二進(jìn)制位,而不是字節(jié)或字。如3&&4,即兩個(gè)真值True相與,結(jié)果為1。但3&4卻要按位表示,即其結(jié)果是0。(2)位邏輯運(yùn)算符&(與AND)

常用于指定某些位清零。如使整型變量x清零,只要寫(xiě)成x=x&0就可以了;如果使一個(gè)字節(jié)的第8位表示為奇偶校驗(yàn)位并將其設(shè)為0,只要ch&127就可以了。而要保留某些位,只要這幾位和1相與,其它位與0相與即可。如要求對(duì)10011100保留低4位,我們?nèi)?0001111和原數(shù)按位相與,即得00001100。(3)位邏輯運(yùn)算符|(或OR)

可用于指定某些位為1。如要使10011100的低4位全為1,我們?nèi)?0001111和原數(shù)按位相或,即得100111111。

(4)位邏輯運(yùn)算符^(異或XOR)。

①使特定位反轉(zhuǎn),只要將該位與1異或即可。如10011101要將低2位都反轉(zhuǎn),我們?nèi)?0000011與其按位異或,即得10011110。

②使某些位保留原值,只要將這些位與0異或即可。如上例中的高6位。③整個(gè)數(shù)清零,只要本身異或一次即可,即x^x。如x為10011100,則x^x得0。④交換兩個(gè)值不用臨時(shí)變量。如a=3,b=4,則a=a^b;b=b^a;a=a^b;即a變成4,b變成3了。具體請(qǐng)看下列式子:(5)位邏輯運(yùn)算符~(反NOT)

是對(duì)該運(yùn)算元素每一位都取反。如~1在8位二進(jìn)制數(shù)中變成了1111110而不是0。如我們要指定某數(shù)x最后一位為0(偶數(shù)),但又不知該數(shù)是1字節(jié)(char型),2字節(jié)(int型)還是4字節(jié)(long型),我們只要做x&~1即可。這常用于不同機(jī)器間的程序移植。也可用于加密,對(duì)一個(gè)數(shù)求一次反碼就變成密碼,再對(duì)密碼求一次反就變成原數(shù)了。(6)左移運(yùn)算符<<使變量中的每一位向左移動(dòng),移出的最高位將丟失(溢出),而右端補(bǔ)入0。左移表達(dá)式的形式為變量名<<移位的位數(shù)例如:a=15,即00001111,取a=a<<2后,即a左移兩位,變成00111100,即十進(jìn)制數(shù)60。對(duì)于無(wú)符號(hào)數(shù),左移一位相當(dāng)于乘2,左移2位相當(dāng)于乘4。(7)右移運(yùn)算符>>使變量中的每一位向右移動(dòng),移出的最低位將丟失,而高端補(bǔ)0(正數(shù))。對(duì)于負(fù)數(shù),即原最高位為1時(shí),右移一位,高端補(bǔ)0稱邏輯右移,高端補(bǔ)1稱算術(shù)右移,這由計(jì)算機(jī)系統(tǒng)決定。對(duì)于TurboC是采用算術(shù)右移,即移入1。右移表達(dá)式的形式為:變量名>>移位的位數(shù)例如:a=16,即00001000,取a=a>>2后,即a右移2位,變?yōu)?0000010,即十進(jìn)制數(shù)4。右移一位相當(dāng)于除2,右移兩位相當(dāng)于除4。(8)位運(yùn)算符中&,|,^,<<,>>可以與賦值號(hào)=組成復(fù)合賦值運(yùn)算符&=,

|=,

^=,<<=,>>=。如a=a&b可寫(xiě)成a&=b,其余類推。凡算術(shù)運(yùn)算符,位運(yùn)算符中的二目運(yùn)算符均可與賦值號(hào)“=”組成復(fù)合運(yùn)算符。2.5.4條件運(yùn)算符和逗號(hào)運(yùn)算符1.條件運(yùn)算符

運(yùn)算符的一般形式是:表達(dá)式1?表達(dá)式2:表達(dá)式3

其含義是:先求表達(dá)式1的值,如果為真(非零),則求表達(dá)式2的值,并把它作為整個(gè)表達(dá)式的值;如表達(dá)式1的值為假(零),則求表達(dá)式3的值,并把它作為整個(gè)表達(dá)式的值。例如:

x=10;

y=x>9?100:200;2.逗號(hào)運(yùn)算符

逗號(hào)運(yùn)算符“,”也稱順序求值運(yùn)算符,其運(yùn)算優(yōu)先級(jí)為15,也是最低的,結(jié)合方向是自左至右。逗號(hào)運(yùn)算符的左邊總是不返回的,也就是說(shuō)逗號(hào)右邊表達(dá)式的值才是整個(gè)表達(dá)式的值。例如:

x=(y=3,y+1)

該表達(dá)式括號(hào)內(nèi)是逗號(hào)表達(dá)式,由于結(jié)合方向是自左至右,先將3賦給y,然后計(jì)算表達(dá)式y(tǒng)+1,其值為4,逗號(hào)左邊的值不返回,逗號(hào)右邊的值才是整個(gè)表達(dá)式的值,所以表達(dá)式的值為4,最后將4賦給x。由于逗號(hào)運(yùn)算符的級(jí)別最低,所以以整體先求值時(shí)一般均需加圓括號(hào)。2.5.5其它運(yùn)算符表2.7其它運(yùn)算符2.5.6運(yùn)算符的優(yōu)先級(jí)和結(jié)合方向表2.8C語(yǔ)言運(yùn)算符的優(yōu)先級(jí)和結(jié)合方向表2.8C語(yǔ)言運(yùn)算符的優(yōu)先級(jí)和結(jié)合方向2.6表達(dá)式2.6.1C的各種表達(dá)式1.算術(shù)表達(dá)式

算術(shù)表達(dá)式的形式如下:

<操作數(shù)><算術(shù)運(yùn)算符><操作數(shù)>

算術(shù)表達(dá)式中運(yùn)算對(duì)象(操作數(shù))是數(shù)值,也可以是字符(按其ASCII碼值進(jìn)行運(yùn)算),運(yùn)算結(jié)果(即表達(dá)式的值)是數(shù)值。如:

a+b*c-d/e

2.關(guān)系表達(dá)式

關(guān)系表達(dá)式的形式如下:

<操作數(shù)><關(guān)系運(yùn)算符><操作數(shù)>

關(guān)系表達(dá)式中運(yùn)算對(duì)象是數(shù)值,也可以是字符(取其ASCII碼值),其運(yùn)算結(jié)果是邏輯量,即為“真”時(shí)取1,為“假”時(shí)取0。3.邏輯表達(dá)式邏輯表達(dá)式的形式如下:

<操作數(shù)><邏輯運(yùn)算符><操作數(shù)>

邏輯表達(dá)式的運(yùn)算對(duì)象是邏輯量。在C語(yǔ)言中無(wú)邏輯量,因此規(guī)定將非零的值按“真”對(duì)待,零值按“假”對(duì)待。而運(yùn)算結(jié)果為“真”時(shí)取1,為“假”時(shí)取0。4.條件表達(dá)式

條件表達(dá)式的形式如下:

<表達(dá)式1>?<表達(dá)式2>:<表達(dá)式3>

其中表達(dá)式1的值按邏輯值對(duì)待,非零為“真”,零值為“假”。而當(dāng)表達(dá)式1值為“真”(非零)時(shí),條件表達(dá)式的值為表達(dá)式2的值;而當(dāng)表達(dá)式1的值為“假”(零)時(shí),條件表達(dá)式的值為表達(dá)式3的值。如y=x?a:b,若x=3則y=a,若x=0,則y=b。表達(dá)式2或表達(dá)式3還可以是另一個(gè)條件表達(dá)式,應(yīng)注意它們是自右至左的結(jié)合方向。如a>b?a:c>d?c:d相當(dāng)于a>b?a:(c>d?c:d),當(dāng)a=1,b=2,c=3,d=4時(shí),此條件表達(dá)式的值等于4。

5.逗號(hào)表達(dá)式逗號(hào)表達(dá)式的形式如下:表達(dá)式1,表達(dá)式2,…,表達(dá)式n

逗號(hào)表達(dá)式按逗號(hào)間的順序依次從左至右執(zhí)行,但整個(gè)逗號(hào)表達(dá)式的值為最后一個(gè)逗號(hào)右邊表達(dá)式的值6.賦值表達(dá)式賦值表達(dá)式是最常用的表達(dá)式,形式如下:

<變量><賦值運(yùn)算符><表達(dá)式>

賦值運(yùn)算符即=,又稱為賦值號(hào)。賦值號(hào)左邊必須是變量、數(shù)組元素等有存貯單元的元素,賦值號(hào)的右邊可以是各類表達(dá)式,也可以是另一個(gè)賦值表達(dá)式。因此a=b=c是合法的,即相當(dāng)于a=(b=c),因?yàn)樗亲杂抑磷蠼Y(jié)合的,即c值先賦給b,b=c賦值表達(dá)式的值為b的值,然后再賦給a,整個(gè)表達(dá)式的值也為a的值。賦值表達(dá)式的求值順序是先計(jì)算賦值號(hào)右邊表達(dá)式的值,再轉(zhuǎn)換成表達(dá)式左邊變量的類型,再進(jìn)行賦值,此值也是賦值表達(dá)式的值。2.6.2表達(dá)式中的類型轉(zhuǎn)換

轉(zhuǎn)換的規(guī)則為:

(1)轉(zhuǎn)換的結(jié)果必定是3種基本類型:int,long或double型。因此兩個(gè)char型的數(shù)據(jù)運(yùn)算,也要先轉(zhuǎn)換成int型,運(yùn)算結(jié)果也是int型;只要有一個(gè)數(shù)據(jù)是float型,都要先轉(zhuǎn)換成double型,最后結(jié)果也是double型。(2)各類型級(jí)別由低到高的順序?yàn)閏har,int,unsigned,long,unsignedlong,float,double。除如(1)所述要進(jìn)行char或short向int,float向double的轉(zhuǎn)換外,其余類型的混合運(yùn)算均按此順序由低到高自動(dòng)轉(zhuǎn)換。另外,C語(yǔ)言規(guī)定,有符號(hào)類型數(shù)據(jù)與無(wú)符號(hào)類型數(shù)據(jù)進(jìn)行混合運(yùn)算,結(jié)果為無(wú)符號(hào)類型。例如,int型數(shù)據(jù)和unsigned類型數(shù)據(jù)的運(yùn)算結(jié)果為unsigned型。

例2.3考慮圖2.1中的類型轉(zhuǎn)換

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 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)論