1. 程式人生 > >BOOL,int,float,指標變數 與“零值”比較的if語句

BOOL,int,float,指標變數 與“零值”比較的if語句

以下摘自《林銳-高質量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);