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

C/C++ 中各類型與零值比較的最佳實踐

     編輯:關於C語言

前言

在 C/C++ 開發中,「與零比較」看似簡單,實則暗藏陷阱。bool、int、float、指針四類型的零值語義各異,比較方式稍有不慎即引發邏輯錯誤。本文梳理標準規範,給出最佳實踐模式,助你寫出健壯代碼。

1. bool 型:勿與 TRUE/FALSE/1/0 直接比較

原因

  • C++ 標準規定:零值為 false,非零值為 true;
  • 但 true 的具體數值不固定:VC++ 為 1,VB 為 -1,其他編譯器可能不同;
  • 直接 if (flag == TRUE) 若 flag 為 2 則判斷失敗。

正確寫法

bool flag = true; // 或 1
if (flag) { /* ... */ }        // 判斷真
if (!flag) { /* ... */ }       // 判斷假

2. int 型:直接與 0 比較

規範

int 的零值明確為 0,可直接用關係運算符。

int a = 1;
if (a == 0) { /* ... */ }
if (a != 0) { /* ... */ }

3. float/double 型:嚴禁 == / != 比較

原因

浮點數在二進制中多為近似表示,如 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) { /* 視為相等 */ }

4. 指針型:與 NULL(或 nullptr)比較

規範

  • 指針的零值語義為「空指針」,標準宏為 NULL(C++11 推薦 nullptr);
  • 切勿與 0 直接比較(雖然隱式轉換合法,但語義不清)。

正確寫法

int a;
int* p = &a;
// ...
if (p == NULL) { /* ... */ }      // C 風格
if (p == nullptr) { /* ... */ }   // C++11 推薦
if (!p) { /* ... */ }             // 簡潔風格

總結速查表

類型零值表示推薦比較方式避免寫法
boolfalseif (flag) / if (!flag)if (flag == TRUE)
int0if (a == 0) / if (a != 0)—
float/double0.0if (fabs(x) <= EPS)if (x == 0.0)
指針NULL/nullptrif (p == nullptr) / if (!p)if (p == 0)

最佳實踐建議

  1. 啟用編譯器警告(-Wall -Wextra 或 /W4),捕獲可疑比較;
  2. 項目統一採用 nullptr(C++11+)替代 NULL;
  3. 浮點數比較封裝為工具函數 bool IsZero(float x, float eps = 1e-6);
  4. bool 變量命名用 is_、has_、can_ 前綴,增強可讀性。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved