複雜問題採用「分而治之」策略,分解為獨立功能模組。C 語言以函數為基本組成單位,天然支援模組化設計,優勢:
型態指定符 函數名稱(參數列表)
參數宣告區
{
函數主體
}
return 返回值型態,可為任何合法型態若未明確指定型態指定符,編譯器預設為 int(整數)。適用於大多數回傳整數的函數。
float、double、char、結構體等)原因:編譯器需在呼叫點知道返回值型態以產生正確機器碼(不同型態長度、內部表示不同)。缺少宣告時編譯器假設為 int,導致錯誤碼產生。
型態指定符 函數名稱( ); // 參數列表留空即可,即使函數有參數
// 函數原型宣告(置於 main 之前或標頭檔)
float sum(float x, float y);
main() {
float result = sum(3.14, 2.86); // 編譯器知 sum 回傳 float,正確處理
...
}
float sum(float x, float y) { // 定義處指定 float
return x + y;
}
#include 該標頭檔C 語言字元與整數隱性轉換,回傳字元的函數常宣告為 int 而非 char,利用預設轉換機制簡化處理。
} 隱性返回(無返回值)重要:一個函數可有多個 return 敘述,各對應不同條件分支。
int compare(int s1, int s2) {
if (s1 == s2) return 1; // 相等返回 1
else return -1; // 不等返回 -1
}
void 型態表示無返回值(舊編譯器可能不支援)return 敘述時,返回值為 0(不保證,不可依賴)
x = power(y); // 指派
if (max(x, y) > 100) printf("greater"); // 條件判斷
for (ch = getchar(); isdigit(ch); ) ... // 迴圈控制
swap(x, y) = 100; // 錯誤:函數呼叫不可作為左值(指派目標)
| 類別 | 說明 | 範例 | 返回值語意 |
|---|---|---|---|
| 純計算型 | 對參數運算回傳結果 | sqr(), sin(), sqrt() | 計算結果 |
| 資訊處理型 | 執行操作,以返回值表示成敗 | write(), fopen() | 成功:正值(如寫入位元組數);失敗:-1 或 NULL |
| 程序型 | 執行動作無實質產出 | printf(), exit() | 附帶資訊(如輸出字元數),常被忽略 |
函數返回值不強制要求接收,開發者可選擇:
z = mul(x, y); — 後續使用printf("%d", mul(x, y)); — 即用即棄mul(x, y); — 僅為副作用(如輸出、修改全域狀態)
int mul(int x, int y) { return x * y; }
main() {
int z;
z = mul(3, 4); // 1. 指派接收
printf("%d", mul(5, 6)); // 2. 直接使用
mul(7, 8); // 3. 忽略返回值(若 mul 有副作用才有意義)
}
return 可多點設置,同時具流程跳轉與返回值功能