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