if语句是C++/C语言中最简单、最常用的语句,然而很多程序员用隐含错误的方式写if语句。本节以与零值比较为例,展开讨论。 

4.3.1   
布尔变量与零值比较
 
 
【规则4-3-1】不可将布尔变量直接与TRUEFALSE或者10进行比较。
 
根据布尔类型的语义,零值为(记为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   
指针变量与零值比较
 
&#61548; 
【规则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)