在 C/C++ 開發中,「與零比較」看似簡單,實則暗藏陷阱。bool、int、float、指針四類型的零值語義各異,比較方式稍有不慎即引發邏輯錯誤。本文梳理標準規範,給出最佳實踐模式,助你寫出健壯代碼。
if (flag == TRUE) 若 flag 為 2 則判斷失敗。bool flag = true; // 或 1
if (flag) { /* ... */ } // 判斷真
if (!flag) { /* ... */ } // 判斷假
int 的零值明確為 0,可直接用關係運算符。
int a = 1;
if (a == 0) { /* ... */ }
if (a != 0) { /* ... */ }
浮點數在二進制中多為近似表示,如 3.0/5.0 可能存為 0.5999999...,直接比較極不可靠。
float a = 3.0f / 5.0f;
const float EPS = 1e-6f; // 允許精度
if (a >= -EPS && a <= EPS) { /* 視為零 */ }
if (fabs(a - target) <= EPS) { /* 視為相等 */ }
NULL(C++11 推薦 nullptr);int a;
int* p = &a;
// ...
if (p == NULL) { /* ... */ } // C 風格
if (p == nullptr) { /* ... */ } // C++11 推薦
if (!p) { /* ... */ } // 簡潔風格
| 類型 | 零值表示 | 推薦比較方式 | 避免寫法 |
|---|---|---|---|
| bool | false | if (flag) / if (!flag) | if (flag == TRUE) |
| int | 0 | if (a == 0) / if (a != 0) | — |
| float/double | 0.0 | if (fabs(x) <= EPS) | if (x == 0.0) |
| 指針 | NULL/nullptr | if (p == nullptr) / if (!p) | if (p == 0) |
-Wall -Wextra 或 /W4),捕獲可疑比較;nullptr(C++11+)替代 NULL;bool IsZero(float x, float eps = 1e-6);is_、has_、can_ 前綴,增強可讀性。