七. 函 數

7-1. 何 謂 函 數 ?
C 語 言 由 函 數 的 集 合 構 成 , 一 個 一 個 函 數 共 同 形 成 一 個 大 的 執 行 單 位 , C 語 言 的 函 數 與 其 它 語 言 的 副 程 式 (subroutine) 大 不 相 同 , 這 是 因 為 C 語 言 的 函 數 與 數 學 上 所 用 的 函 數 相 同 , 具 有 "引數" 與 "傳回值(函數值)" 。 因 此 , 利 用 C 語 言 可 以 寫 出 非 常 漂 亮 的 程 式 結 構 。
C 語 言 使 用 的 函 數 其 呼 叫 方 法 與 數 學 上 使 用 的 函 數 完 全 相 同 , 例 如 :

a = function ( x , y ) ;

將 變 數 x , y 輸 入 函 數 function , 其 傳 回 值 (函數值) 設 定 給 變 數 a 。

7-2. 函 數 的 定 義 (格式)

      儲存類別   資料形別   函數名稱   ( 形式引數的串列 )

       形式引數的宣告 ;

       {
     
           函數的本體(執行敘述)

       } 


       extern int func(x)
       
       int x;
         
       {
            
         statement 

       }         

7-3. 函 數 的 儲 存 類 別

函 數 的 儲 存 類 別
儲存類別 功能敘述
static 只能在進行宣告的編譯單位內可以執行
extern 在進行宣告的編譯單位以外也可執行


ps. 一 般 函 數 的 儲 存 類 別 可 以 省 略 , 此 時 當 作 " extern " 處 理 。
我 們 來 看 example 7-3-1 。


   example 7-3-1 :

         file1.c

         extern func1( )
       {
             .
             .
       }
         static func2( )
       {
             .
             .
       } 


         file2.c

         extern func1( );

         static func3( )
       {
             .
             .
          func1( );
             .
             .
       }  

7-4. 函 數 的 傳 回 值 與 資 料 形 態
要 求 函 數 送 回 傳 回 值 (函數值) , 必 須 在 函 數 本 體 中 利 用 return 敘 述 進 行 , 例 如 :

return ( 變數或式子 ) ;

此 處 必 須 先 宣 告 傳 回 值 (函數值) 的 資 料 形 態 是 什 麼 , 這 就 是 前 面 函 數 的 定 義 中 所 宣 告 的 資 料 形 態 。

7-5. 值 的 傳 遞 方 法
( 1 ) 傳 遞 變 數 值 本 身 ( Call by value ) : example 7-5-1 。
( 2 ) 傳 遞 變 數 的 位 址 ( Call by reference ) : example 7-5-2 。


   example 7-5-1 :

         #include < stdio.h > 
         main( )
       {
          int x,y,z,p;
          x=y=z=3;
          p=func(x,y,z);
          printf("p-->%d\n",p);
       }
         int func(a,b,c)
         int a,b,c;
       {
          int d;
         d=a+b+c;
         return(d);
       }

   result :
               p-->9


   example 7-5-2 :

         #include < stdio.h >
         main( )
       {
          int x,y,z,p;
          x=y=z=3;
          func(&x,&y,&z,&p);
          printf("p-->%d\n",p);
       }
         func(a,b,c,d)
         int *a,*b,*c,*d;
       {
          *d=*a+*b+*c;
       }

   result :
               p-->9

7-6. 遞 歸 ( recursive )
C 語 言 的 函 數 可 進 行 遞 歸 呼 叫 ( recursive call ) , 也 就 是 說 在 函 數 之 中 可 呼 叫 函 數 本 身 。 函 數 在 進 行 遞 歸 呼 叫 時 , 在 其 所 使 用 的 變 數 被 堆 積 在 堆 疊 區 域 , 每 次 執 行 return 敘 述 , 函 數 在 該 層 呼 叫 中 所 使 用 的 變 數 就 從 堆 疊 返 回 。 像 這 樣 進 行 多 次 遞 歸 呼 叫 因 需 要 許 多 堆 疊 區 域 , 所 以 並 非 是 很 有 效 率 的 方 法 。 請 參 閱 example 7-6-1 。


   example 7-6-1 :

         #include < stdio.h >
         main()
       {
          int i=0;
          while(++i<6)
             printf("%d! is %d\n",i,factorial(i));
       }
        factorial(n)
        int n;
      {
         if(n==1)
            return(1);
         else
            return(n*factorial(n-1));
      }

   result :
               1! is 1
               2! is 2
               3! is 6
               4! is 24
               5! is 120

回 到 C 語 言 入 門 教 室 首 頁