if語(yǔ)句是C++/C語(yǔ)言中最簡(jiǎn)單、最常用的語(yǔ)句,然而很多程序員用隱含錯誤的方式寫(xiě)if語(yǔ)句。本節以“與零值比較”為例,展開(kāi)討論。
l 【規則
根據布爾類(lèi)型的語(yǔ)義,零值為“假”(記為FALSE),任何非零值都是“真”(記為TRUE)。TRUE的值究竟是什么并沒(méi)有統一的標準。例如Visual C++ 將TRUE定義為1,而Visual Basic則將TRUE定義為-1。
假設布爾變量名字為flag,它與零值比較的標準if語(yǔ)句如下:
if (flag) // 表示flag為真
if (!flag) // 表示flag為假
其它的用法都屬于不良風(fēng)格,例如:
if (flag == TRUE)
if (flag == 1 )
if (flag == FALSE)
if (flag == 0)
l 【規則
假設整型變量的名字為value,它與零值比較的標準if語(yǔ)句如下:
if (value == 0)
if (value != 0)
不可模仿布爾變量的風(fēng)格而寫(xiě)成
if (value) // 會(huì )讓人誤解 value是布爾變量
if (!value)
l 【規則
千萬(wàn)要留意,無(wú)論是float還是double類(lèi)型的變量,都有精度限制。所以一定要避免將浮點(diǎn)變量用“==”或“!=”與數字比較,應該設法轉化成“>=”或“<=”形式。
假設浮點(diǎn)變量的名字為x,應當將
if (x == 0.0) // 隱含錯誤的比較
轉化為
if ((x>=-EPSINON) && (x<=EPSINON))
其中EPSINON是允許的誤差(即精度)。
l 【規則
指針變量的零值是“空”(記為NULL)。盡管NULL的值與0相同,但是兩者意義不同。假設指針變量的名字為p,它與零值比較的標準if語(yǔ)句如下:
if (p == NULL) // p與NULL顯式比較,強調p是指針變量
if (p != NULL)
不要寫(xiě)成
if (p == 0) // 容易讓人誤解p是整型變量
if (p != 0)
或者
if (p) // 容易讓人誤解p是布爾變量
if (!p)
有時(shí)候我們可能會(huì )看到 if (NULL == p) 這樣古怪的格式。不是程序寫(xiě)錯了,是程序員為了防止將 if (p == NULL) 誤寫(xiě)成 if (p = NULL),而有意把p和NULL顛倒。編譯器認為 if (p = NULL) 是合法的,但是會(huì )指出 if (NULL = p)是錯誤的,因為NULL不能被賦值。
程序中有時(shí)會(huì )遇到if/else/return的組合,應該將如下不良風(fēng)格的程序
if (condition)
return x;
return y;
改寫(xiě)為
if (condition)
{
return x;
}
else
{
return y;
}
或者改寫(xiě)成更加簡(jiǎn)練的
聯(lián)系客服