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

C 語言宏定義陷阱:整數除法導致除零錯誤,改用浮點常數修正

     編輯:程式設計綜合問答

錯誤程式碼

#define HARMONIC_MEAN(X, Y) ( 1/((1/X+1/Y) / 2) )

int main() {
    printf("%g\n", HARMONIC_MEAN(2, 3));  // 編譯錯誤:divide by zero
}

錯誤原因

宏展開後為整數運算:

1 / ((1/2 + 1/3) / 2)
→ 1 / ((0 + 0) / 2)   // 整數除法截斷為 0
→ 1 / 0               // 除零錯誤

修正方法:強制浮點運算

#define HARMONIC_MEAN(X, Y) ( 1.0 / ((1.0/(X) + 1.0/(Y)) / 2.0) )

int main() {
    printf("%f\n", HARMONIC_MEAN(2, 3));  // 輸出 2.400000
    return 0;
}

關鍵點

  • 在宏中使用 1.0、2.0 等浮點常數,編譯器將整個運算提升為 double。
  • 參數 X、Y 建議加括號 (X)、(Y),防止傳入運算式時優先級錯誤。
  • 宏無型別檢查,複雜運算建議改用 inline 函數或模板(C++),更安全可除錯。

進階:型別泛型寫法 (C11 _Generic / C++ 模板)

// C++ 模板版
template <typename T>
T harmonic_mean(T x, T y) {
    return 2 * x * y / (x + y);  // 代數等價形式,避免巢狀除法
}

記住:宏只是文字替換,型別由使用處決定,涉及除法務必確保至少一個運算元為浮點數。

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