【正文】
)、終止于頂部的循環(huán)結(jié)構(gòu)(while,for)、終止于底部循環(huán)結(jié)構(gòu)(do),及其循環(huán)中斷命令(break)。函數(shù)的返回值可以是基本類(lèi)型、結(jié)構(gòu)、共同體或指針。任何的函數(shù)均可以遞歸調(diào)用。通常局部變量都是“自動(dòng)型的”,或者說(shuō),是在每次調(diào)用時(shí)重新建立的。函數(shù)定義不能嵌套,但是變量可以在塊結(jié)構(gòu)中說(shuō)明。C程序的函數(shù)單獨(dú)存放于源文件中,分別編譯。變量可定義為函數(shù)的內(nèi)部變量,某一源文件中可以使用的外部變量,也可以定義為整個(gè)程序均可見(jiàn)的全程變量。預(yù)處理功能可以對(duì)程序文本進(jìn)行宏替換,并可以蘊(yùn)含其他源文件,或進(jìn)行條件編譯。C語(yǔ)言是一種相對(duì)低級(jí)的語(yǔ)言,也就是說(shuō)它可以處理大多數(shù)機(jī)器本身所能處理的數(shù)據(jù)類(lèi)型,如:字符、數(shù)值、地址等。這些數(shù)據(jù)既可以同機(jī)器所支持的算術(shù)和邏輯運(yùn)算符組合,也可以由它們進(jìn)行傳送。對(duì)于字符串、集合、表、數(shù)組等組合數(shù)據(jù)類(lèi),C語(yǔ)言沒(méi)有提供直接的操作。雖然一個(gè)結(jié)構(gòu)可以整體復(fù)制,但是C語(yǔ)言中無(wú)法對(duì)整個(gè)數(shù)組或字符串進(jìn)行整體操作。除了函數(shù)內(nèi)的局部變量可以進(jìn)行靜態(tài)定義和堆堆棧無(wú)用內(nèi)存收集機(jī)制。最后一點(diǎn),C語(yǔ)言本身也沒(méi)有提供輸入/輸出功能,沒(méi)有讀/寫(xiě)語(yǔ)句及內(nèi)在的文件存取方法。所有這些高層的機(jī)制都是由通過(guò)函數(shù)顯式調(diào)用的。大多數(shù)的C語(yǔ)言版本都帶有基本標(biāo)準(zhǔn)的函數(shù)庫(kù),其中包含了以上這些函數(shù)?;谕瑯拥牡览恚珻語(yǔ)言僅僅提供了直接的、單線程的流程控制,如測(cè)試、循環(huán)、分支及子程序等;沒(méi)有多道程序控制、并行操作、同步,協(xié)同例程管理。沒(méi)有上述功能看起來(lái)像是一種缺陷,不過(guò),把語(yǔ)言控制在較小的規(guī)模確有許多優(yōu)點(diǎn)。鑒于C語(yǔ)言相對(duì)較小,可以用比較少的篇幅予以描述,并可以短時(shí)間內(nèi)掌握。如果說(shuō)程序員可以了解、掌握并確定經(jīng)常使用全部的語(yǔ)言,并不奇怪。1983年,美國(guó)國(guó)家標(biāo)準(zhǔn)協(xié)會(huì)(ANSI)成立了一個(gè)專(zhuān)門(mén)的委員會(huì),對(duì)C語(yǔ)言進(jìn)行全面的、現(xiàn)代化的定義。其結(jié)果便是ANSIC,是1988下后期完成的,這一標(biāo)準(zhǔn)的大多數(shù)功能在較新的編譯系統(tǒng)中業(yè)已付諸實(shí)施。這一標(biāo)準(zhǔn)是基于早期的C語(yǔ)言參考手冊(cè)建立的,相對(duì)而言,語(yǔ)言本身沒(méi)有多大變化;其目的之一就是為了保證現(xiàn)存的大多數(shù)程序可以有效運(yùn)行,或者,在不兼容的情況下,由編譯程序提出警告,說(shuō)明(程序可能導(dǎo)致的)新的操作。對(duì)大多數(shù)程序員來(lái)說(shuō),最重要的變化是函數(shù)的說(shuō)明及定義有了一種新的語(yǔ)法?,F(xiàn)在,在函數(shù)的說(shuō)明中可以包含參數(shù)的描述;函數(shù)的定義語(yǔ)法也作了相應(yīng)的修改。有了這種附加信息,編譯程序就可以很容易地檢查出由于參數(shù)類(lèi)型不匹配所造成的錯(cuò)誤。事實(shí)證明,對(duì)C語(yǔ)言的這一擴(kuò)充非常奏效。ANSI C對(duì)C語(yǔ)言的第二個(gè)貢獻(xiàn)是定義了一套伴隨C語(yǔ)言的函數(shù)庫(kù),其中說(shuō)明的函數(shù)涉及到對(duì)操作系統(tǒng)的訪問(wèn)(如文件的讀寫(xiě))、格式輸入輸出、內(nèi)存分配、字符串操作等等。ANSI C還規(guī)定了一套標(biāo)準(zhǔn)的首標(biāo)文件,提供了對(duì)于函數(shù)說(shuō)明及數(shù)據(jù)類(lèi)型的統(tǒng)一使用方法。程序只要使用這一函數(shù)庫(kù)與機(jī)器交換信息,其兼容性就可以得到保證,大多數(shù)的庫(kù)函數(shù)都是以UNIX系統(tǒng)的“標(biāo)準(zhǔn)的I/O函數(shù)庫(kù)”為基礎(chǔ)建立的。雖然C語(yǔ)言可以充分發(fā)揮多數(shù)計(jì)算機(jī)的功能,但是,它并不依賴于具體的計(jì)算機(jī)體系結(jié)構(gòu),只需稍加注意,就可以編寫(xiě)出可移植的應(yīng)用程序,也就是說(shuō)程序不用修改就可以在各種機(jī)器上運(yùn)行。不過(guò),像其他語(yǔ)言一樣,C語(yǔ)言也有自己的缺陷。比如,某些運(yùn)算符的優(yōu)先順序存在錯(cuò)誤;還有的語(yǔ)句在語(yǔ)法上可以更好一些,盡管如此,實(shí)踐業(yè)已證明C語(yǔ)言在各種編程運(yùn)用中非常有效,并具有良好的表現(xiàn)力。上面簡(jiǎn)單介紹了C語(yǔ)言的歷史及特點(diǎn),現(xiàn)在我們來(lái)考察一個(gè)C語(yǔ)言例程,以便大家對(duì)C語(yǔ)言程序的結(jié)構(gòu)有所了解。以下這個(gè)程序用于計(jì)算6的階乘: /*program to find factorial of 6*/includedefine VALUE 6int i,j。main(){ j=1。for (I=1。I=VALUE。I++) j=j*I。printf(“The factorial of %d is %d \n”,VALUE,j)。}如例中所示,C語(yǔ)言程序(代碼)以“include”一句開(kāi)始,其目的只是編譯程序?qū)標(biāo)準(zhǔn)函數(shù)庫(kù)蘊(yùn)含到用戶程序中,以便于讀寫(xiě)數(shù)據(jù)、處理文本文件等等。C語(yǔ)言帶有大量像“”這樣的標(biāo)準(zhǔn)函數(shù)庫(kù),包括字符串處理、時(shí)間及數(shù)學(xué)運(yùn)算等函數(shù)庫(kù)?!癲efine”一行定義了一個(gè)常量。“int i,j”一行說(shuō)明了兩個(gè)全局變量,定義了兩個(gè)變量的屬性(本例中為整數(shù))。其他常用的變量類(lèi)型還有浮點(diǎn)型(指實(shí)數(shù)型)、字符型(指字符)等,其說(shuō)明格式同整型類(lèi)似。“main()”一行說(shuō)明了本程序的主函數(shù)。每一個(gè)C語(yǔ)言程序都必須有一個(gè)名為“main()”的函數(shù),可出現(xiàn)于程序的任意位置,用以標(biāo)記程序的開(kāi)始。在C語(yǔ)言中函數(shù)的語(yǔ)句都被括在一對(duì){}中。在本例中,主函數(shù)包括三行語(yǔ)句,分別是賦值語(yǔ)句、for循環(huán)語(yǔ)句,及printf格式輸出語(yǔ)句。C語(yǔ)言中的“printf”語(yǔ)句很容易使用。雙引號(hào)中的部分叫作格式串,用于描述數(shù)據(jù)在輸出時(shí)的格式。格式串可以包括字符常量,如“The factorial of”及“\n”(又稱(chēng)作轉(zhuǎn)義序列,\n表示回車(chē));還可以包括形如“%d”的操作符,用作待輸出變量的定位符。本例中格式串的兩個(gè)操作符(又叫作轉(zhuǎn)換說(shuō)明),表示出現(xiàn)于后續(xù)參數(shù)表中的整型數(shù)值將被置于該格式字符串的指定位置。類(lèi)似的格式操作符還有表示浮點(diǎn)數(shù)值的“%f”、表示字符的“%c”,及表示字符串的“%s”等。必須注意,在“printf”語(yǔ)句中,格式串中操作符的數(shù)目與后續(xù)的變量在類(lèi)型及數(shù)目上要嚴(yán)格對(duì)應(yīng)。例如,如果格式串包含三個(gè)操作符,在后面的參數(shù)也必須有三個(gè),并且參數(shù)在類(lèi)型及出現(xiàn)的順序上要與前面的操作符一致。這個(gè)程序還可以,不過(guò),如果能將常量改為由程序讀入數(shù)值,則會(huì)更好一些。編輯該程序,刪除VALUE常量,并說(shuō)明一個(gè)全局變量“value”(把所有變更引用都改為小寫(xiě),因?yàn)椤皏alue”現(xiàn)已說(shuō)明為一個(gè)變量),然后將以下兩行加到程序的開(kāi)始處:printf(“Enter the value:”)。scanf(“%d”,amp。value)。修改程序,進(jìn)行編譯并運(yùn)行,以確保程序無(wú)誤。值得注意的是,“printf”使用的格式串與“scanf”相同,“value”變量前的“&”字符在C語(yǔ)言中稱(chēng)作地址操作符,用于返回指定變量的內(nèi)存地址。出現(xiàn)于“scanf”中的字符型、整型、浮點(diǎn)型,以及記錄型(即結(jié)構(gòu)型)的任何變量都必須加上“&”操作符。倘若漏掉“&”,運(yùn)行程序時(shí)就會(huì)出現(xiàn)錯(cuò)誤。