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