首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> C 語言問答

C語言實現兩數取最小值:三元運算符與函數封裝最佳實踐

     編輯:C 語言問答

最簡潔實現

#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) 用於浮點數。

教學重點

  1. **三元運算符** cond ? expr1 : expr2 是表達式,有返回值,適合初始化/返回語句。
  2. **函數封裝** 提升可讀性、可複用、可測試,static inline 消除調用開銷。
  3. **宏副作用** 是 C 語言經典陷阱,能用函數/內聯函數絕不用宏。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved