C 語(yǔ)言基礎(chǔ)教程(我的C之旅開(kāi)始了)[二]
3. C 程序的結(jié)構(gòu)
C 程序由一個(gè)以上的函數(shù)組成,而且必須有 main 函數(shù)。此外,C 程序一般還有一些預(yù)處理指令。例如 #include 指令。當(dāng)然并不是必須要有 #include 指令。函數(shù)由函數(shù)頭和函數(shù)體組成。函數(shù)頭由返回值、函數(shù)名以及參數(shù)列表(可以是void)組成。函數(shù)體從 { 開(kāi)始,以 } 結(jié)束。函數(shù)體里可以有一系列的語(yǔ)句,每個(gè)語(yǔ)句以分號(hào)(;)結(jié)束。例如:
預(yù)處理指令 ——〉 #include <stdio.h>
函數(shù)頭 ——〉 int main( void )
函數(shù)體開(kāi)始 ——〉 {
變量聲明語(yǔ)句 ——〉 int i;
賦值語(yǔ)句 ——〉 i = 1;
函數(shù)調(diào)用語(yǔ)句 ——〉 printf( "%d\n", i );
return 語(yǔ)句 ——〉 return 0;
函數(shù)體結(jié)束 ——〉 }
簡(jiǎn)而言之,一個(gè)簡(jiǎn)單的標(biāo)準(zhǔn) C 程序的結(jié)構(gòu)如下:
#include <stdio.h>/*非必須。若沒(méi)用到stdio.h里聲明的函數(shù),則不需要*/
int main(void)
{
一系列語(yǔ)句
return 0;
}
4. 第二個(gè) C 程序 |
首先請(qǐng)看以下代碼,并且和我們的第一個(gè) C 程序比較比較,看看這個(gè)程序新增了什么知識(shí)點(diǎn)。 /* meter2centimeters.c -- 以厘米為單位來(lái)表示兩米 */ #include <stdio.h> int main(void) centimeters = 100 * meters; /* 100 乘以 meters */ return 0; 下面我們來(lái)仔細(xì)分析這個(gè)小程序。 1. 文檔 2. 多重聲明 3. 乘法運(yùn)算 4. printf 函數(shù) printf( "Yes, I said %d centimeters!\n", 100 * meters ); |
5. 如何編寫(xiě)函數(shù) |
首先請(qǐng)看以下代碼。 /* my_func.c -- 這個(gè)程序使用了一個(gè)自定義函數(shù) */ void butler(void); /* ISO/ANSI C 函數(shù)原型 */ int main(void) /* 函數(shù)頭 */ return 0; void butler(void) /* butler 函數(shù) */ 上面的代碼中,butler 出現(xiàn)了 3 次。第一次是作為函數(shù)原型;第二次是函數(shù)調(diào)用語(yǔ)句;第三次是函數(shù)定義。下面我們分別對(duì) butler 的這三次出現(xiàn)作詳細(xì)說(shuō)明。 1. 函數(shù)原型是聲明函數(shù)的一種方式,是 C89 標(biāo)準(zhǔn)加入的概念,老舊的編譯器可能不支持函數(shù)原型。函數(shù)原型用于告訴編譯器我們將要使用一個(gè)特定的函數(shù),它指明了函數(shù)的屬性。例如,butler 的函數(shù)原型中,第一個(gè) void 指明 butler 函數(shù)沒(méi)有返回值;第二個(gè) void 表明 butler 沒(méi)有參數(shù),也就是不接收任何參數(shù)。在 main 函數(shù)前面寫(xiě)了 butler 的函數(shù)原型后,當(dāng) main 函數(shù)調(diào)用 butler 時(shí),編譯器就能檢測(cè)到 butler 函數(shù)調(diào)用語(yǔ)句是否正確。如果 main 函數(shù)前面沒(méi)有 butler 的函數(shù)原型,那么我們就不能在 main 函數(shù)中調(diào)用 butler 函數(shù),除非我們把函數(shù)定義放在 main 函數(shù)之前。不過(guò)把函數(shù)定義置于 main 函數(shù)之前是一種不好的編程風(fēng)格,因?yàn)檫@將導(dǎo)致我們花不少時(shí)間來(lái)尋找 main 函數(shù)的所在地。想象一下,如果我們寫(xiě)了幾十個(gè)函數(shù),如果每個(gè)函數(shù)定義都置于 main 函數(shù)之前,那樣 main 函數(shù)還算好找;但是如果我們不小心把某些函數(shù)放在了 main 函數(shù)后面,也就是說(shuō) main 函數(shù)被放在一堆函數(shù)中間,那就很難找了! 2. 在 main 函數(shù)里,語(yǔ)句 butler(); 的作用是調(diào)用 butler 函數(shù)。因?yàn)?butler 的參數(shù)列表為空(void),所以函數(shù)名(butler)后面的括號(hào)中不能有任何參數(shù),也不能是 butler(void); 。 3. butler 函數(shù)和 main 函數(shù)的定義方式一樣,也是由函數(shù)頭和函數(shù)體構(gòu)成。函數(shù)頭和函數(shù)原型幾乎一模一樣,只是少了一個(gè)分號(hào)。注意,函數(shù)定義僅僅是一個(gè)定義而已,并不能決定函數(shù)什么時(shí)候執(zhí)行,也不能決定函數(shù)是否執(zhí)行。main 函數(shù)什么時(shí)候調(diào)用 butler 函數(shù),butler 函數(shù)就什么時(shí)候執(zhí)行;如果 main 函數(shù)沒(méi)有調(diào)用 butler 函數(shù),那么 butler 函數(shù)就不會(huì)執(zhí)行。 所有 C 程序都是從 main 函數(shù)開(kāi)始執(zhí)行的。無(wú)論 main 函數(shù)處在源文件中的任何位置,中間也罷,末尾也罷,總之,C 程序一定是從 main 函數(shù)開(kāi)始執(zhí)行。把 main 函數(shù)寫(xiě)在源文件的開(kāi)頭是一個(gè)好的編程習(xí)慣,因?yàn)檫@樣可以讓讀者很快地弄清楚程序的結(jié)構(gòu)。 到目前為止,我們已經(jīng)對(duì)函數(shù)有了一個(gè)概要的了解。在后續(xù)的教程中,我們還會(huì)更詳細(xì)更系統(tǒng)地學(xué)習(xí)函數(shù)。 |
6. 關(guān)鍵字和保留標(biāo)識(shí)符 |
關(guān)鍵字是保留字,不能用來(lái)做標(biāo)識(shí)符(如變量名),例如:int double; 是錯(cuò)誤的,因?yàn)?double 是關(guān)鍵字,不能做變量名。使用關(guān)鍵字來(lái)做變量名是一種語(yǔ)法錯(cuò)誤,不能通過(guò)編譯!下表列出了 C 語(yǔ)言的所有關(guān)鍵字,其中紅色的是 ISO C99 標(biāo)準(zhǔn)新增的關(guān)鍵字。 auto enum restrict unsigned C 語(yǔ)言已經(jīng)使用了的標(biāo)識(shí)符,以及使用權(quán)利被 C 語(yǔ)言保留的標(biāo)識(shí)符,稱(chēng)為保留標(biāo)識(shí)符。保留標(biāo)識(shí)符包括以下劃線(_)開(kāi)始的標(biāo)識(shí)符(如 __LINE__)和標(biāo)準(zhǔn)庫(kù)里定義的函數(shù)的函數(shù)名(如 printf)。 |
相關(guān)文章

C++代碼和可執(zhí)行程序在x86和arm上的區(qū)別介紹

C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之線索二叉樹(shù)及其遍歷

C++實(shí)現(xiàn)學(xué)生住宿管理系統(tǒng)

C++?opencv圖像處理實(shí)現(xiàn)灰度變換示例

C語(yǔ)言入門(mén)學(xué)習(xí)筆記之typedef簡(jiǎn)介

C++數(shù)據(jù)結(jié)構(gòu)之哈希算法詳解