BOOL,int,float,指標變數 與“零值”比較的if語句
阿新 • • 發佈:2019-01-22
以下摘自《林銳-高質量C++c程式設計指南》
/* ---------------------------------------------------------------------------- */
if語句是C++/C語言中最簡單、最常用的語句,然而很多程式設計師用隱含錯誤的方式寫if語句。本節以“與零值比較”為例,展開討論。
4.3.1 布林變數與零值比較
【規則4-3-1】不可將布林變數直接與TRUE、FALSE或者1、0進行比較。
根據布林型別的語義,零值為“假”(記為FALSE),任何非零值都是“真”(記為TRUE)。TRUE的值究竟是什麼並沒有統一的標準。例如Visual C++ 將TRUE定義為1,而Visual Basic則將TRUE定義為-1。
假設布林變數名字為flag,它與零值比較的標準if語句如下:
if (flag) // 表示flag為真
if (!flag) // 表示flag為假
其它的用法都屬於不良風格,例如:
if (flag == TRUE)
if (flag == 1 )
if (flag == FALSE)
if (flag == 0)
4.3.2 整型變數與零值比較
【規則4-3-2】應當將整型變數用“==”或“!=”直接與0比較。
假設整型變數的名字為value,它與零值比較的標準if語句如下:
if (value == 0)
if (value != 0)
不可模仿布林變數的風格而寫成
if (value) // 會讓人誤解 value是布林變數
if (!value)
4.3.3 浮點變數與零值比較
【規則4-3-3】不可將浮點變數用“==”或“!=”與任何數字比較。
千萬要留意,無論是float還是double型別的變數,都有精度限制。所以一定要避免將浮點變數用“==”或“!=”與數字比較,應該設法轉化成“> =”或“ <=”形式。
假設浮點變數的名字為x,應當將
if (x == 0.0) // 隱含錯誤的比較
轉化為
if ((x> =-EPSINON) && (x <=EPSINON))
其中EPSINON是允許的誤差(即精度)。
4.3.4 指標變數與零值比較
【規則4-3-4】應當將指標變數用“==”或“!=”與NULL比較。
指標變數的零值是“空”(記為NULL)。儘管NULL的值與0相同,但是兩者意義不同。假設指標變數的名字為p,它與零值比較的標準if語句如下:
if (p == NULL) // p與NULL顯式比較,強調p是指標變數
if (p != NULL)
不要寫成
if (p == 0) // 容易讓人誤解p是整型變數
if (p != 0)
或者
if (p) // 容易讓人誤解p是布林變數
if (!p)
4.3.5 對if語句的補充說明
有時候我們可能會看到 if (NULL == p) 這樣古怪的格式。不是程式寫錯了,是程式設計師為了防止將 if (p == NULL) 誤寫成 if (p = NULL),而有意把p和NULL顛倒。編譯器認為 if (p = NULL) 是合法的,但是會指出 if (NULL = p)是錯誤的,因為NULL不能被賦值。
程式中有時會遇到if/else/return的組合,應該將如下不良風格的程式
if (condition)
return x;
return y;
改寫為
if (condition)
{
return x;
}
else
{
return y;
}
或者改寫成更加簡練的
return (condition ? x : y);
/* ---------------------------------------------------------------------------- */
if語句是C++/C語言中最簡單、最常用的語句,然而很多程式設計師用隱含錯誤的方式寫if語句。本節以“與零值比較”為例,展開討論。
4.3.1 布林變數與零值比較
【規則4-3-1】不可將布林變數直接與TRUE、FALSE或者1、0進行比較。
根據布林型別的語義,零值為“假”(記為FALSE),任何非零值都是“真”(記為TRUE)。TRUE的值究竟是什麼並沒有統一的標準。例如Visual C++ 將TRUE定義為1,而Visual Basic則將TRUE定義為-1。
假設布林變數名字為flag,它與零值比較的標準if語句如下:
if (flag) // 表示flag為真
if (!flag) // 表示flag為假
其它的用法都屬於不良風格,例如:
if (flag == TRUE)
if (flag == 1 )
if (flag == FALSE)
if (flag == 0)
4.3.2 整型變數與零值比較
【規則4-3-2】應當將整型變數用“==”或“!=”直接與0比較。
假設整型變數的名字為value,它與零值比較的標準if語句如下:
if (value == 0)
if (value != 0)
不可模仿布林變數的風格而寫成
if (value) // 會讓人誤解 value是布林變數
if (!value)
4.3.3 浮點變數與零值比較
【規則4-3-3】不可將浮點變數用“==”或“!=”與任何數字比較。
千萬要留意,無論是float還是double型別的變數,都有精度限制。所以一定要避免將浮點變數用“==”或“!=”與數字比較,應該設法轉化成“> =”或“ <=”形式。
假設浮點變數的名字為x,應當將
if (x == 0.0) // 隱含錯誤的比較
轉化為
if ((x> =-EPSINON) && (x <=EPSINON))
其中EPSINON是允許的誤差(即精度)。
4.3.4 指標變數與零值比較
【規則4-3-4】應當將指標變數用“==”或“!=”與NULL比較。
指標變數的零值是“空”(記為NULL)。儘管NULL的值與0相同,但是兩者意義不同。假設指標變數的名字為p,它與零值比較的標準if語句如下:
if (p == NULL) // p與NULL顯式比較,強調p是指標變數
if (p != NULL)
不要寫成
if (p == 0) // 容易讓人誤解p是整型變數
if (p != 0)
或者
if (p) // 容易讓人誤解p是布林變數
if (!p)
4.3.5 對if語句的補充說明
有時候我們可能會看到 if (NULL == p) 這樣古怪的格式。不是程式寫錯了,是程式設計師為了防止將 if (p == NULL) 誤寫成 if (p = NULL),而有意把p和NULL顛倒。編譯器認為 if (p = NULL) 是合法的,但是會指出 if (NULL = p)是錯誤的,因為NULL不能被賦值。
程式中有時會遇到if/else/return的組合,應該將如下不良風格的程式
if (condition)
return x;
return y;
改寫為
if (condition)
{
return x;
}
else
{
return y;
}
或者改寫成更加簡練的
return (condition ? x : y);