程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C >> C語言基礎知識 >> C 語言基礎教程(我的C之旅開始了)[二]

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

編輯:C語言基礎知識

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 語言使用或者保留了,所以使用保留標識符來做自定義變量或者函數等的標識符可能會引起意想不到的問題。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved