編寫一個宏 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),不便統一判斷;浮點數相減可能產生極小非零值,導致邏輯誤判。
[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 實現類型安全的比較函數。