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

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

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

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

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