1.2 C程序結構
可見,為與其他語言相區別,C程序源文件通常是以“.c”為擴展名的。在C語言中,程序一般由編譯預處理指令、數據或數據結構定義以及若干個函數組成。下面就如圖1.6所示的程序代碼來分析C程序的組成和結構。

圖1.6 Ex_Sim.c的程序代碼
1.2.1 main函數
代碼中,main表示主函數。由于無論main函數在整個程序中處于什么位置,每一個程序執行時都必須從main開始,因此每一個C程序或由多個源文件組成的C項目都必須包含一個且只能有一個main函數。
在main函數代碼中,“int main()”稱為main函數的函數頭(函數首部)。函數頭下面是用一對花括號“{”和“}”括起來的部分,稱為main函數的函數體。函數體中包括若干條語句(按書寫次序依次順序執行),每一條語句都用分號“;”結束,它是語句的一部分。函數名main的前面有一個int,它表示main 函數的類型是整型,須在函數體中使用關鍵字return將其后面的值作為函數的返回值。由于return語句運行后,函數體內部return后面的語句不再被執行,因此return語句一般寫在函數體的最后。
在main函數體中,各行語句的含義如下:
第1條(行號6)語句用來定義兩個雙精度實型(double)變量r和area。即向編譯系統申請開辟兩塊用于存取雙精度實型數據的內存空間,變量名r和area分別是這兩個內存空間的名稱或標識。
第2條(行號7)語句調用在stdio.h中定義的庫函數printf用來輸出(C語言本身并不提供輸出操作),雙引號中的內容是printf的格式字符串,可含有由%引導的格式,其功能是按格式字符串的含義將結果輸出到屏幕上。
第3條(行號8)語句調用在stdio.h中定義的庫函數scanf進行輸入(C語言本身并不提供輸入操作),雙引號中的內容是scanf的格式字符串,用來將用戶輸入的內容按格式字符串中指定的格式保存到后面的變量r所在的內存中,&r是取變量r的內存地址。當程序運行到此句時,程序暫停,等待用戶輸入。若輸入10,則scanf根據“%lf”就將10這個數據按雙精度實型的格式存儲到由r命名的那個內存空間中。簡單地說,此時變量r的值為10.000000。
第4條(行號9)語句是一條賦值語句,它先計算賦值運算符“=”右邊的表達式“3.14159 * r * r”,然后將計算出的結果存儲到由area命名的內存空間中。這就是說,此時變量area的值為314.159000。
第5條(行號10)語句和第2條語句一樣都是調用庫函數printf進行輸出,與第2條語句不同的是,printf的格式字符串包含一個由%引導的格式“%f”,它的作用是使printf函數中的第2個參數(逗號后面的參數)area中存儲的值314.159000以浮點形式填充在格式字符串中的“%f”位置處,這樣字符串“圓的面積為:%f”就變成了“圓的面積為:314.159000”。另外,printf的格式字符串的最后還有一個“\n”,它的含義不是字符“n”的含義,而是在此處按Enter鍵換行,這樣的字符稱為轉義字符。
第6條(行號11)語句是一條庫函數調用語句。為了能像Visual C++ 6.0那樣可以看到最后的結果,若使用其他C語言開發工具,則一般應在程序代碼中的最后一句“return 0;”之前加上一句代碼:“getch();”。getch是一個在conio.h頭文件中定義的庫函數(以后會討論),用來獲取當前單個字符(不用按Enter鍵確認)。這樣,當程序執行到此句代碼時,就會等待用戶的鍵盤輸入,按任意鍵(除Shift鍵,Alt鍵和Ctrl鍵之外)即可返回。
最后一條語句的含義前面已做過說明,這里不再重復。于是程序的結果為
輸入圓的半徑:10 ? 圓的面積為:314.159000
在以后的C程序運行結果中,本書不再完整顯示其控制臺窗口,僅將控制臺窗口中運行結果部分裁剪下來列出,并加以單線陰影邊框。另外,凡有下畫線的數據表示是通過鍵盤輸入,書中出現的“?”表示按一下Enter鍵,本書做此約定。
事實上,C程序的基本結構就是函數,所以有時又稱C是函數式語言。而語句則是C程序的基本單位,具有獨立的程序功能。在書寫時,一行可以寫上多條語句,也可以一條語句分幾行書寫,但每條語句都必須以分號“;”結束。語句和語句之間,行與行之間都可以有多個或多行空格。
1.2.2 頭文件的包含
在如圖1.6所示的Ex_Sim.c源程序中,行號2和行號3的代碼是C文件包含(#include)的編譯指令,稱為預處理指令。#include后面的stdio.h和conio.h是C編譯器自帶的文件,稱為C庫文件。其中,stdio.h定義了標準輸入/輸出的相關數據及其操作(在英文中,標準譯為standard,輸入/輸出譯為input/output,這樣就解釋了stdio.h的含義),而conio.h則定義了與控制臺(console,con)相關的輸入/輸出操作。由于程序用到了輸入/輸出庫函數printf和scanf以及控制臺鍵盤操作函數getch。因而需要用#include將stdio.h和conio.h合并到程序中,又由于它們總是被放置在源程序文件的起始處,所以這些庫文件被稱為頭文件(Header File)。事實上,C編譯器自帶了許多這樣的頭文件,每個頭文件都支持一組特定的“工具”,用于實現基本輸入/輸出、數值計算、字符串處理等方面的操作。
在C語言中,頭文件包含有兩種格式。一種是將文件名用尖括號“<>”括起來,用來包含那些由編譯系統提供的并放在指定子文件夾中的頭文件,稱為標準方式。另一種是將文件名用雙引號括起來的方式,稱為用戶方式。以這種方式,系統先在用戶當前工作文件夾中查找要包含的文件,若找不到再按標準方式查找(即再按尖括號的方式查找)。一般來說,用尖括號的方式來包含編譯器自帶的頭文件;用雙引號來包含用戶自己編寫的頭文件,以節省查找時間。
1.2.3 注釋
在前面的源程序中,“/*……*/”之間的內容都是用來注釋的,它的目的只是為了提高程序的可讀性,對編譯和運行并不起作用。正是因為這一點,所以注釋的內容既可以用漢字來表示,也可以用英文來說明,只要便于理解就行。
一般來說,注釋應在編程的過程中同時進行,不要指望程序編制完成后再補寫注釋。那樣只會多花好幾倍的時間,更為嚴重的是,時間久了甚至會讀不懂自己寫的程序。
需要說明的是
(1)“/*……*/”可用來實現多行的注釋,它使編譯器將由“/*”開頭到“*/”結尾之間所有內容均視為注釋,稱為塊注釋。塊注釋(“/*……*/”)的注解方式可以出現在程序中的任何位置,包括在語句或表達式之間。
(2)ANSI/ISO C90還支持由“//”引導的注釋方式,它使編譯器將“//”開始一直到行尾的內容作為注釋,稱為行注釋。Visual C++支持此注釋方式,但Turbo C 2.0不支持。
- Mastering Ext JS(Second Edition)
- Google Apps Script for Beginners
- Visual Studio 2012 Cookbook
- 騰訊iOS測試實踐
- Java加密與解密的藝術(第2版)
- 算法大爆炸:面試通關步步為營
- FreeSWITCH 1.6 Cookbook
- Processing互動編程藝術
- Banana Pi Cookbook
- Elasticsearch for Hadoop
- 深入淺出PostgreSQL
- ScratchJr趣味編程動手玩:讓孩子用編程講故事
- 遠方:兩位持續創業者的點滴思考
- AngularJS UI Development
- Mobile Test Automation with Appium