C 速查手冊
6.5 函數
函數 (function) 是利用 C 語言寫程式 (program) 的模組單位, C 程式的執行是以函數為單位的,語言保留函數名稱 main() 作為每個 C 程式執行的起始點,因此,所有可執行的 C 程式都需要一個名為 main() 的函數。
自行定義函數的目的是將程式的功能切割為不同的模組,需要時再以呼叫的方式使用該函數所提供的功能。以下,我們先來看看該怎麼定義函數。
C 語言中的函數與數學上的意義相同,例如指數函數
指數函數需要底數 a 及指數 x ,然後計算出對應的 a 的 x 值,也就是 y 的值。若是用 C 語言寫此一指數函數, a 與 x 為所需定義的參數,而 y 為函數的回傳值。
寫成函數,如下
int exponent(
{
int result = 1;
while (x > 0) {
result *= a;
x--;
}
return result;
}
形如以下的格式
// 區域變數宣告
// 函數工作區
// return 陳述
}
函數定義的第一行依序指明回傳值型態 (return type) 、函數名稱及小括弧內的參數列 (parameter list) 宣告, C 語言的函數可以接受多個參數,但只能回傳單一個值,因此回傳值型態便是指明該單一回傳值 (return value) 的型態。
函數名稱必須是合法的識別字,參數 (parameter) 名稱亦同,此外,每個參數除了名稱,亦須指明型態。
兩個大括弧圍起來的便是函數內容,大體上分成三區,首先為函數所需變數的宣告,此變數為函數內的區域變數 (local variable) 。這裡的指數函數是宣告 result 用來保存計算結果,同時指派初值為 1 。
其次為函數工作區的陳述 (statement) ,這裡指數函數的例子是利用一個 while 迴圈 (loop) ,讓 result 不斷乘上底數 a ,然後指數 x 逐次遞減,直到遞減為 0 ,迴圈隨之結束。
最後為 return 陳述,也就是函數回傳數值的地方。 return 為 C 語言的關鍵字之一,主要用為函數回傳數值,其後可接運算式,最後會回傳該運算式計算出的值。
C 語言僅有傳值呼叫 (call by value) ,不論參數或回傳值都是傳遞拷貝後的數值,因此各自函數內的變數都為區域變數,互不相干。呼叫函數無法修改原呼叫函數內的值,但可以傳回處理計算過的值給呼叫函數。
以下是一個示範這個指數函數的完整程式
#include <stdio.h>
int exponent(int a, int x)
{
int result = 1;
while (x > 0) {
result *= a;
x--;
}
return result;
}
int main(void)
{
int i;
for (i = 0; i <= 10; i++) {
printf("%2d%5d\n", i, exponent(2, i));
}
return 0;
}
/* 《程式語言教學誌》的範例程式
http://kaiching.org/
檔名:exponent1.c
功能:測試指數函數,從 2 的 0 次方列印到 10 次方
作者:張凱慶 */
編譯後執行,結果如下
$ gcc exponent1.c |
$ a.out |
0 1 |
1 2 |
2 4 |
3 8 |
4 16 |
5 32 |
6 64 |
7 128 |
8 256 |
9 512 |
10 1024 |
$ |
注意 exponent() 的定義放在函數 main() 之前的地方。函數 main() 裡面在 printf() 內呼叫 exponent() ,因為 exponent() 會回傳整數,所以可以直接作為 printf() 的參數。
函數主題還有以下文章