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

C 語言防錯技巧:常量在前的比較寫法

     編輯:關於C

一個隱蔽的 Bug:if (sum == 3) vs if (3 == sum)

看似等價的兩種寫法,在 C/C++ 中卻有天壤之別的安全性。

錯誤示範

[c]
int sum = 2;
if (sum == 3) {          // 正確邏輯
    printf("true\n");
} else {
    printf("false\n");
}

手滑瞬間:少寫一個 =

[c]
if (sum = 3) {   // 本意是 ==,誤寫為 =
    printf("true\n");
} else {
    printf("false\n");
}

後果:

  • 賦值表達式 sum = 3 的值是 3(非零),視為 true。
  • sum 被意外修改為 3。
  • 編譯器**不報錯**(合法語法),邏輯錯誤隱蔽極難排查。

常量在前:編譯器幫你攔截

[c]
if (3 = sum) {   // 錯誤:不能向常量賦值
    // ...
}

編譯器直接報錯:error: lvalue required as left operand of assignment。錯誤在編譯期暴露,零運行成本。

最佳實踐建議

場景推薦寫法理由
比較變量與常量if (CONST == var)防止誤賦值,編譯期報錯
比較兩個變量if (a == b)無常量,無法應用此技巧
現代編譯器開啟 -Wparentheses / /WallGCC/Clang/MSVC 會對 if (a = b) 發出警告
C++ 現代寫法if (auto v = func(); v == 3)C++17 初始化語句,賦值與比較徹底分離

總結

「常量在左,變量在右」是 C/C++ 經典的**防禦性編程**習慣。雖然現代編譯器警告已能捕獲大多數誤賦值,但養成此習慣零成本、跨編譯器、跨語言(Java/C# 同樣適用),是資深工程師的肌肉記憶之一。

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