C 語言基礎教程(我的C之旅開始了)[二]

來源:互聯網
上載者:User

3. C 程式的結構

C 程式由一個以上的函數組成,而且必須有 main 函數。此外,C 程式一般還有一些預先處理指令。例如 #include 指令。當然並不是必須要有 #include 指令。函數由函數頭和函數體組成。函數頭由傳回值、函數名以及參數列表(可以是void)組成。函數體從 { 開始,以 } 結束。函數體裡可以有一系列的語句,每個語句以分號(;)結束。例如:

預先處理指令 ——〉 #include <stdio.h>

函數頭 ——〉 int main( void )
函數體開始 ——〉 {
變數聲明語句 ——〉 int i;
指派陳述式 ——〉 i = 1;

函數調用語句 ——〉 printf( "%d\n", i );

return 語句 ——〉 return 0;
函數體結束 ——〉 }

簡而言之,一個簡單的標準 C 程式的結構如下:

#include <stdio.h>/*非必須。若沒用到stdio.h裡聲明的函數,則不需要*/

int main(void)
{
一系列語句

return 0;
}

4. 第二個 C 程式

首先請看以下代碼,並且和我們的第一個 C 程式比較比較,看看這個程式新增了什麼知識點。

/* meter2centimeters.c -- 以厘米為單位來表示兩米 */

#include <stdio.h>

int main(void)
{
int meters, centimeters;
meters = 2;

centimeters = 100 * meters; /* 100 乘以 meters */
printf( "%d-meter is equal to %d centimeters.\n", meters, centimeters );
printf( "Yes, I said %d centimeters!\n", 100 * meters );

return 0;
}

下面我們來仔細分析這個小程式。

1. 文檔
這段代碼頭部的注釋標明了檔案名稱和程式的作用,我們把這些注釋稱為文檔。寫文檔是一個很好的習慣,可以協助我們瞭解程式的作用。在由多個源檔案組成的程式中,文檔顯得更為重要。由於我們目前為止所寫的都是很簡單的程式,您也許還不覺得寫文檔有多大的作用,甚至還覺得浪費時間。但是我們應該養成寫文檔的習慣,這對我們以後寫複雜的程式很有協助。對於複雜程式,我們應該儘可能把文檔寫得更詳盡。可以參考以下格式:
/***************************************************
* 檔案名稱: meter2centimeters.c
* 作者: Antigloss at http://cpp.ga-la.com
* 編寫日期: 05-9-9 0:00
* 最後修改日期: 05-9-9 0:00
* 功能: 以厘米為單位來表示兩米
* 演算法: 1 米 = 100 厘米
**************************************************/

2. 多重聲明
int meters, centimeters;
上面那句聲明語句聲明了兩個變數。我們可以在一句聲明語句中聲明任意數目的變數,只要變數名之間用逗號(,)隔開就可以了。例如下面這個語句聲明了 4 個變數。
int a, b, c, d;

3. 乘法運算
C 語言中,* 是乘法運算子,所以 centimeters = 100 * meters; 的意思是:用 100 乘以變數 meters 的值(本例中為 2),然後把相乘的結果賦值給變數 centimeters 。

4. printf 函數
printf( "%d-meter is equal to %d centimeters.\n", meters, centimeters );
上面這個語句中預留位置 %d 出現了兩次。第一個 %d 由變數 meters 的值替換;而第二個 %d 則由 centimeters 的值替換。注意:每個變數由逗號(,)隔開;"%d-meter is equal to %d centimeters.\n" 中的雙引號是必須的,而且必須是英文的雙引號,不能是中文的雙引號。

printf( "Yes, I said %d centimeters!\n", 100 * meters );
上面這個語句表明,用於替換預留位置的不僅僅可以是變數,也可以是運算式(100 * meters 是一個乘法運算式)。


5. 如何編寫函數

首先請看以下代碼。

/* my_func.c -- 這個程式使用了一個自訂函數 */
#include <stdio.h>

void butler(void); /* ISO/ANSI C 函數原型 */

int main(void) /* 函數頭 */
{ /* 函數體開始 */
printf("I will summon the butler function.\n");
butler(); /* 調用 butler 函數 */
printf("Yes. Bring me some tea and writeable CD-ROMS.\n");

return 0;
} /* 函數體結束 */

void butler(void) /* butler 函數 */
{
printf("You rang, sir?\n");
}

上面的代碼中,butler 出現了 3 次。第一次是作為函數原型;第二次是函數調用語句;第三次是函數定義。下面我們分別對 butler 的這三次出現作詳細說明。

1. 函數原型是聲明函數的一種方式,是 C89 標準加入的概念,老舊的編譯器可能不支援函數原型。函數原型用於告訴編譯器我們將要使用一個特定的函數,它指明了函數的屬性。例如,butler 的函數原型中,第一個 void 指明 butler 函數沒有傳回值;第二個 void 表明 butler 沒有參數,也就是不接收任何參數。在 main 函數前面寫了 butler 的函數原型後,當 main 函數調用 butler 時,編譯器就能檢測到 butler 函數調用語句是否正確。如果 main 函數前面沒有 butler 的函數原型,那麼我們就不能在 main 函數中調用 butler 函數,除非我們把函數定義放在 main 函數之前。不過把函數定義置於 main 函數之前是一種不好的編程風格,因為這將導致我們花不少時間來尋找 main 函數的所在地。想象一下,如果我們寫了幾十個函數,如果每個函數定義都置於 main 函數之前,那樣 main 函數還算好找;但是如果我們不小心把某些函數放在了 main 函數後面,也就是說 main 函數被放在一堆函數中間,那就很難找了!
C89 標準出台之前,C 語言也支援函式宣告,不過我們只能指定函數的傳回值類型,而不能列出參數列表。例如:
void butler();
C89 之前,函數就是像上面所寫的那樣聲明的。C89 和 C99 標準都支援這種聲明方式,不過它們同時也指出,這種聲明方式遲早會被淘汰!所以我們不要使用這種聲明方式,而要用函數原型。

2. 在 main 函數裡,語句 butler(); 的作用是調用 butler 函數。因為 butler 的參數列表為空白(void),所以函數名(butler)後面的括弧中不能有任何參數,也不能是 butler(void); 。

3. butler 函數和 main 函數的定義方式一樣,也是由函數頭函數體構成。函數頭和函數原型幾乎一模一樣,只是少了一個分號。注意,函數定義僅僅是一個定義而已,並不能決定函數什麼時候執行,也不能決定函數是否執行。main 函數什麼時候調用 butler 函數,butler 函數就什麼時候執行;如果 main 函數沒有調用 butler 函數,那麼 butler 函數就不會執行。

所有 C 程式都是從 main 函數開始執行的。無論 main 函數處在源檔案中的任何位置,中間也罷,末尾也罷,總之,C 程式一定是從 main 函數開始執行。把 main 函數寫在源檔案的開頭是一個好的編程習慣,因為這樣可以讓讀者很快地弄清楚程式的結構。

到目前為止,我們已經對函數有了一個概要的瞭解。在後續的教程中,我們還會更詳細更系統地學習函數。

6. 關鍵字和保留標識符

關鍵字是保留字,不能用來做標識符(如變數名),例如:int double; 是錯誤的,因為 double 是關鍵字,不能做變數名。使用關鍵字來做變數名是一種語法錯誤,不能通過編譯!下表列出了 C 語言的所有關鍵字,其中紅色的是 ISO C99 標準新增的關鍵字。

auto enum restrict unsigned
break extern return void
case float short volatile
char for signed while
const goto sizeof _Bool
continue if static _Complex
default inline struct _Imaginary
do int switch
double long typedef
else register union

C 語言已經使用了的標識符,以及使用權利被 C 語言保留的標識符,稱為保留標識符。保留標識符包括以底線(_)開始的標識符(如 __LINE__)和標準庫裡定義的函數的函數名(如 printf)。
我們不應該使用保留標識符來做我們自訂的變數或者函數等的標識符。使用保留標識符來做自訂變數或者函數等的標識符不是語法錯誤,可以通過編譯,因為保留標識符是合法的標識符,符合標識符命名法則。但是,因為這些標識符已經被 C 語言使用或者保留了,所以使用保留標識符來做自訂變數或者函數等的標識符可能會引起意想不到的問題。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.