當面對「根據輸入選項執行對應操作」且選項範圍可控時,switch-case 或 if-else 鏈會隨選項增多而降低可讀性與效率。跳轉表(轉移表)將函數指針存入陣列,以選項為索引直接調用,實現 O(1) 分派,且程式碼極其簡潔。
// 1. 定義函數指針陣列(跳轉表)
int (*oper_func[])(int, int) = { add, sub, mul, div };
// 2. 選項與索引映射表
char oper_sequence[4][10] = { "add", "sub", "mul", "div" };
// 3. 運行時查找索引並調用
int seq = find_index(user_input, oper_sequence, 4);
result = oper_func[seq](a, b);
#include <stdio.h>
#include <string.h>
#define M 4
int add(int a, int b) { return a + b; }
int sub(int a, int b) { return a - b; }
int mul(int a, int b) { return a * b; }
int div(int a, int b) { return a / b; }
// 跳轉表:函數指針陣列
int (*oper_func[])(int, int) = { add, sub, mul, div };
char oper_sequence[M][10] = { "add", "sub", "mul", "div" };
int main() {
char oper[10];
int a, b, seq = -1;
printf("Operator: "); scanf("%s", oper);
printf("a: "); scanf("%d", &a);
printf("b: "); scanf("%d", &b);
for (int i = 0; i < M; i++) {
if (strncmp(oper_sequence[i], oper, 3) == 0) { seq = i; break; }
}
if (seq != -1) {
printf("result is %d\n", oper_func[seq](a, b));
} else {
printf("Unknown operator\n");
}
return 0;
}
default_handler,索引超界時自動落入選項值→索引 的映射表(如雜湊表或二分查找陣列)[OP_ADD] = add 避免手動維護順序| 方案 | 時間複雜度 | 維護性 | 適用場景 |
|---|---|---|---|
| if-else 鏈 | O(n) | 差 | 選項少、條件複雜 |
| switch-case | O(1)~O(n) | 中 | 整數連續選項 |
| 跳轉表 | O(1) | 優 | 固定集合、高頻調用、需動態擴展 |