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 / /Wall | GCC/Clang/MSVC 會對 if (a = b) 發出警告 |
| C++ 現代寫法 | if (auto v = func(); v == 3) | C++17 初始化語句,賦值與比較徹底分離 |
「常量在左,變量在右」是 C/C++ 經典的**防禦性編程**習慣。雖然現代編譯器警告已能捕獲大多數誤賦值,但養成此習慣零成本、跨編譯器、跨語言(Java/C# 同樣適用),是資深工程師的肌肉記憶之一。