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

C語言「全能比較函數」進化:從類型相關返回到統一 int 返回

     編輯:關於C語言

背景

編寫一個宏 COMPARE(TYPE, a, b),能對任意基本類型(int、double、char、float…)進行比較,並返回統一的 int:

  • >0 表示 a > b
  • =0 表示 a == b
  • <0 表示 a < b

第一版:直接相減

[cpp]
#define COMPARE(TYPE,a,b) ((TYPE)a - (TYPE)b)

缺點:返回類型隨 TYPE 變化(如 double 返回 double),不便統一判斷;浮點數相減可能產生極小非零值,導致邏輯誤判。

第二版:三元運算統一為 int

[cpp]
#define COMPARE(TYPE,a,b) \
    (((TYPE)a - (TYPE)b) == 0 ? 0 : (((TYPE)a - (TYPE)b) > 0 ? 1 : -1))

優點:

  • 返回類型固定為 int,便於 if (COMPARE(...) > 0) 等統一邏輯。
  • 適用於所有基本算術類型。

完整測試代碼

[cpp]
#include <stdio.h>

#define COMPARE(TYPE,a,b) \
    (((TYPE)a - (TYPE)b) == 0 ? 0 : (((TYPE)a - (TYPE)b) > 0 ? 1 : -1))

int main() {
    int result;
    double a=1, b=1.5;
    int x=10, y=1;
    char m='m', n='n';
    float f1=6.02, f2=6.0200002;

    result = COMPARE(double, a, b);  printf("%d\n", result); // -1
    result = COMPARE(int, x, y);     printf("%d\n", result); // 1
    result = COMPARE(char, m, n);    printf("%d\n", result); // -1
    result = COMPARE(float, f1, f2); printf("%d\n", result); // -1

    return 0;
}

注意事項

  • 浮點數精度:直接用 ==0 判斷相等在浮點數中不安全,工程上常引入 eps(如 fabs(a-b) < 1e-9)。
  • 副作用:宏參數 a、b 被多次求值,若傳入 ++i 等有副作用表達式會出錯;建議改為 inline 函數模板(C++)或 _Generic(C11)。
  • 類型轉換:(TYPE)a 為強制轉換,確保按目標類型語義比較。

總結

第二版宏實現了「統一返回 int」的目標,適合簡單場景;複雜項目建議使用 C++ 模板或 C11 _Generic 實現類型安全的比較函數。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved