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

C 語言宏定義陷阱:#define S(x) PT*x*x 導致運算優先級錯誤,正確寫法加括號

     編輯:程式設計綜合問答

錯誤代碼

#define PT 5.5
#define S(x) PT*x*x

int main() {
    int a=1, b=2;
    printf("%4.1f\n", S(a+b)); // 輸出 9.5
}

展開過程

S(a+b) → PT * a+b * a+b → 5.5 * 1+2 * 1+2 → 運算順序:乘法優先 → 5.5 + 2 + 2 = 9.5。

預期計算

面積公式 PT * (a+b) * (a+b) = 5.5 * 3 * 3 = 49.5。

修正宏定義

#define S(x) (PT * (x) * (x))
// 或更安全:參數與表達式均加括號
#define S(x) ((PT) * (x) * (x))

宏定義黃金法則

  1. **參數加括號**:(x) 防止傳入表達式優先級錯亂。
  2. **整體加括號**:( ... ) 防止宏展開後與外部運算符優先級衝突。
  3. **常量加括號**:(PT) 防止常量為表達式時出錯。

對比

// 修正後
printf("%4.1f\n", S(a+b)); // 輸出 49.5
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved