7.1 函式的概念與定義方式
重複的程式碼是所有 bug 的根源。當你發現同樣的邏輯在多個地方出現,就應該把它抽出來寫成一個函式。
函式是一段可重複使用的程式碼,你提供輸入(參數),它返回輸出(回傳值)。就像工廠流水線上的一台機器,你丟進去物料,它吐出來成品。
函式的定義格式:
回傳的資料型態 函式名稱(參數1型態 參數1名稱, 參數2型態 參數2名稱, ...) {
函式內容
return 要回傳的值;
}
¶範例程式碼
範例 1:計算兩個整數的和
#include<iostream>
using namespace std;
// 定義函式:計算兩個整數的和
int sum(int x, int y) {
// x 和 y 是參數,函式內可以使用它們
return x + y; // return 後面跟著要回傳的值
}
int main() {
// 呼叫函式並把結果存到變數
int a = 3, b = 5;
int result = sum(a, b); // result = 8
cout << result << "\n";
return 0;
}
執行結果:
8
範例 2:找兩個整數中較大的那個
#include<iostream>
using namespace std;
// 定義函式:找較大值
int maxVal(int x, int y) {
if (x > y) {
return x;
}
return y;
}
int main() {
int a = 7, b = 3;
cout << maxVal(a, b) << "\n"; // 輸出 7
cout << maxVal(10, 15) << "\n"; // 輸出 15,可以直接傳數字
return 0;
}
執行結果:
7
15
¶重要細節
函式宣告順序
如果你要在 main() 中呼叫 sum() 函式,必須在 main() 之前定義 sum()。順序很重要:
// ✓ 正確寫法:函式定義在 main 之前
int sum(int x, int y) {
return x + y;
}
int main() {
cout << sum(3, 5) << "\n";
return 0;
}
// ✗ 錯誤寫法:這樣編譯會報錯,因為 main 看不到 sum
int main() {
cout << sum(3, 5) << "\n"; // 此時還不知道 sum 是什麼
return 0;
}
int sum(int x, int y) {
return x + y;
}
同名函式是允許的(函式重載)
你可以有多個名稱相同的函式,只要它們的參數個數或型態不同就行。編譯器會根據你傳入的參數自動選擇合適的版本:
#include<iostream>
using namespace std;
// 版本 1:兩個 int 的 max
int max(int x, int y) {
return (x > y) ? x : y;
}
// 版本 2:兩個 long long 的 max(參數型態不同)
long long max(long long x, long long y) {
return (x > y) ? x : y;
}
// 版本 3:三個 int 的 max(參數個數不同)
int max(int x, int y, int z) {
if (x > y && x > z) return x;
if (y > z) return y;
return z;
}
int main() {
cout << max(3, 5) << "\n"; // 呼叫版本 1,輸出 5
cout << max(1000000000000LL, 999999999999LL) << "\n"; // 呼叫版本 2
cout << max(3, 5, 7) << "\n"; // 呼叫版本 3,輸出 7
return 0;
}
¶函式的排版
函式定義的排版和前面一脈相承——{ 接在行尾、函式體縮排一層;參數列則比照「逗號後空格」的習慣:
// ✓ 好的排版
int add(int a, int b) {
return a + b;
}
// ✗ 不好的排版
int add(int a,int b){return a+b;}
| 規則 | ✓ 好的做法 | ✗ 不好的做法 | 為什麼 |
|---|---|---|---|
| 函式名接括號不空格 | add(int a, int b) |
add (int a, int b) |
函式名和 ( 緊貼,跟關鍵字 if (/for ( 剛好相反 |
| 參數逗號後空格 | int a, int b |
int a,int b |
和宣告、初始化一致(1.5 提過) |
| 左大括號接行尾 | int add(...) { |
{ 另起一行 |
和 if、迴圈同一套習慣 |
| 函式體縮排一層 | return ...; 往右縮 |
頂著最左邊 | 一眼看出這些是函式內部的動作 |
動手試試看:修改範例 2,定義一個 minVal() 函式找最小值,然後在 main() 中呼叫它找出三個數中的最小值。