函式是 C 語言模組化程式設計的核心單元。本文透過五個實用範例,循序漸進示範函式宣告、定義、參數傳遞、回傳值、遞迴與實際應用場景,助你掌握自訂函式的精髓。
// 宣告
void sayHi(void);
// 定義
void sayHi(void) {
printf("大家好!!\n");
}
// 呼叫
sayHi();
void printTriangle(int n) {
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= i; j++)
printf("*");
printf("\n");
}
}
// 呼叫
int n;
printf("請輸入層數: ");
scanf("%d", &n);
printTriangle(n);
void printParallelogram(int n) {
for (int i = 0; i <= n; i++) {
// 印製前導空格:隨行數遞增
for (int j = 0; j <= i; j++)
printf(" ");
// 印製星號:固定寬度
for (int k = 0; k <= n; k++)
printf("*");
printf("\n");
}
}
輸出樣貌 (n=4):
*****
*****
*****
*****
*****
int myPower(int base, int exp) {
int result = 1;
for (int i = 1; i <= exp; i++)
result *= base;
return result;
}
// 呼叫
int base, exp;
printf("請輸入底數: "); scanf("%d", &base);
printf("請輸入指數: "); scanf("%d", &exp);
printf("%d^%d = %d\n", base, exp, myPower(base, exp));
int myAbs(int n) {
return (n >= 0) ? n : -n;
}
#include
#include
// 函式宣告
void sayHi(void);
void printTriangle(int n);
void printParallelogram(int n);
int myPower(int base, int exp);
int myAbs(int n);
int main(void) {
int choice, n, base, exp;
while (1) {
printf("\n=== 自訂函式示範選單 ===\n");
printf("1. 問候函式\n");
printf("2. 直角三角形\n");
printf("3. 平行四邊形\n");
printf("4. 冪次運算\n");
printf("5. 絕對值\n");
printf("0. 結束\n");
printf("請選擇: ");
scanf("%d", &choice);
switch (choice) {
case 1: sayHi(); break;
case 2:
printf("層數: "); scanf("%d", &n);
printTriangle(n); break;
case 3:
printf("邊長: "); scanf("%d", &n);
printParallelogram(n); break;
case 4:
printf("底數: "); scanf("%d", &base);
printf("指數: "); scanf("%d", &exp);
printf("結果: %d\n", myPower(base, exp)); break;
case 5:
printf("整數: "); scanf("%d", &n);
printf("絕對值: %d\n", myAbs(n)); break;
case 0: return 0;
default: printf("無效選項\n");
}
}
}
// 函式定義 (同上)
// 定義函式指標類型
typedef int (*MathFunc)(int, int);
int add(int a, int b) { return a + b; }
int mul(int a, int b) { return a * b; }
void calculate(MathFunc func, int x, int y) {
printf("結果: %d\n", func(x, y));
}
// 使用
calculate(add, 3, 4); // 7
calculate(mul, 3, 4); // 12
int factorial(int n) {
return (n <= 1) ? 1 : n * factorial(n - 1);
}
int fibonacci(int n) {
if (n <= 1) return n;
return fibonacci(n - 1) + fibonacci(n - 2);
}
// 建議編譯器內聯展開,減少呼叫開銷
inline int max(int a, int b) {
return (a > b) ? a : b;
}
| 原則 | 說明 |
|---|---|
| 單一職責 | 每個函式只做一件事,功能內聚 |
| 參數驗證 | 檢查指標非 NULL、範圍合法、除數非零 |
| const 正確性 | 輸入指標加 const、不修改參數傳值 |
| 錯誤處理 | 回傳錯誤碼、設定 errno、或輸出參數回傳狀態 |
| 命名規範 | 動詞開頭、語意清晰 (如 calculateSum, parseConfig) |
| 文件註解 | Doxygen 格式說明用途、參數、回傳、副作用 |