最簡潔實現
#include <stdio.h>
// 內聯函數建議:編譯器可直接展開,零調用開銷
static inline int min(int a, int b) {
return a < b ? a : b;
}
int main() {
int x, y;
printf("請輸入兩個整數:");
if (scanf("%d %d", &x, &y) != 2) return 1;
int z = min(x, y);
printf("min = %d\n", z);
return 0;
}
進階泛型寫法 (C11 _Generic)
#define MIN(X, Y) _Generic((X), \
int: min_int, \
double: min_double, \
float: min_float \
)(X, Y)
static inline int min_int(int a, int b) { return a < b ? a : b; }
static inline double min_double(double a, double b) { return a < b ? a : b; }
static inline float min_float(float a, float b) { return a < b ? a : b; }
// 使用
int m = MIN(3, 5);
double d = MIN(3.14, 2.71);
宏版本陷阱與修正
// 危險:副作用雙重求值
#define MIN_BAD(a,b) ((a)<(b)?(a):(b))
// MIN_BAD(x++, y) → x 增加兩次!
// 較安全:用語句表達式 (GNU 擴展) 或內聯函數
#define MIN_SAFE(a,b) ({ \
typeof(a) _a = (a); \
typeof(b) _b = (b); \
_a < _b ? _a : _b; \
})
標準庫替代
- C++:
std::min (<algorithm>)。
- C: 無標準
min,POSIX 提供 fmin/fminf/fminl (math.h) 用於浮點數。
教學重點
- **三元運算符**
cond ? expr1 : expr2 是表達式,有返回值,適合初始化/返回語句。
- **函數封裝** 提升可讀性、可複用、可測試,
static inline 消除調用開銷。
- **宏副作用** 是 C 語言經典陷阱,能用函數/內聯函數絕不用宏。