C 速查手冊

函數

函數 (function) 是利用 C 語言寫程式 (program) 的模組單位, C 程式的執行是以函數為單位的,語言保留函數名稱 main() 作為每個 C 程式執行的起始點,因此,所有可執行的 C 程式都需要一個名為 main() 的函數。

自行定義函數的目的是將程式的功能切割為不同的模組,需要時再以呼叫的方式使用該函數所提供的功能。以下,我們先來看看該怎麼定義函數。

C 語言中的函數與數學上的意義相同,例如指數函數

y = a x

指數函數需要底數 a 及指數 x ,然後計算出對應的 a 的 x 值,也就是 y 的值。若是用 C 語言寫此一指數函數, a 與 x 為所需定義的參數,而 y 為函數的回傳值。

寫成函數,如下

int exponent(int a, int x)
{
    int result = 1;
    
    while (x > 0) {
        result *= a;
        x--;
    }
    
    return result;
}

形如以下的格式

回傳值型態 函數名稱(參數型態1 參數名稱1, 參數型態2 參數名稱2, ...) {
     // 區域變數宣告
     // 函數工作區
     // 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() 的參數。

有些作者會把函數定義時所用的參數稱之為 parameter ,呼叫函數時實際提供的參數值則稱之為 argument ,中文通常翻作「引數」,於此不特別區分兩者的差別,基本上都統稱為「參數」。

函數主題還有以下文章

回 C 速查手冊首頁