【正确答案】
【答案解析】在编写程序时,经常需要对变量与“零值”进行比较判断。考查对0值判断是衡量程序员基本功的重要标准,不同变量与零值的判断,往往方法也不一样,但很多程序员往往会存在很多误区,将NULL、0、1、FALSE、TRUE的意思混淆。例如,把BOOL型变量的0判断可以写成if(var==0),把int型变量与零值比较写成if(!var),把指针变量与零值的比较写成if(!var),虽然上述写法程序也能正确运行,但是未能清晰地表达程序的意思。
一般地,如果想让if判断一个变量是真还是假,应直接使用if(var)、if(!var),表明其为“逻辑”判断;如果用if判断一个数值型变量(如short、int、long等),应该用if(var==0),表明是与0进行“数值”上的比较:而判断指针则最好使用if(var==NULL)。对于浮点数的比较,首先需要考虑到的问题就是浮点型变量在内存中的存储导致它并不是一个精确的数,所以不可以将float变量用“==”或“!=”与数字比较,应该设法转化成“>=”或“<=”形式。
具体而言,分以下几种情况:
1)int类型。
if(n==0)
if(n!=0)
不推荐的写法有:
if(n)
if(!n)
因为这样写容易让人误解n是布尔变量。
2)float类型。无论是float还是double类型的变量,由于它们在内存中的存储机制与整型数不同,有舍入误差,所以在计算机中,大多数浮点数都是无法精确表达的,很难用A==B来判定两个浮点数是否相同。在判断浮点数相等时,推荐用范围来确定,若x在某一范围内,就认为相等,至于范围怎么定义,要依据实际情况而定,float和double也各有不同。所以都不可以用“==”或“!=”与任何数字比较,应该设法转化成“>=”或“<=”某个精度值。具体方式如下所示:
const float EPSINON=0.00001:
if((x>=-EPSINO)&&(x<=EPSINON)
上例中EPSINON的取值是0.00001,而一般对于该值的选取主要是按照实际情况设置的。
错误的写法有以下两种形式:
if(x==0.0)
if(x!=0.0)
需要注意的是,因为浮点数的精度误差,导致对于确切的两个浮点数a与b,a+b的值和b+a的值永远是相等的,而浮点数的运算是不可结合的,所以(a+b)+c的值和(a+c)+b的值就不一定相等了。
3)bool类型。
if(flag)
if(!flag)
不推荐的写法有:
if(flag==TRUE)
if(flag==FALSE)
if(flag==1)
if(fla==0)
4)指针类型。
if(p==NULL)
if(p!=NULL)
不推荐的写法有:
if(p==0)
if(p!=0)
上述写法容易让人误解p是整型变量。
if(p)
if(!p)
上述写法容易让人误解p是bool型变量。
在进行比较时,有一个比较容易忽略的问题,就是将双等号“==”与单等号“=”混淆。其实与日常生活中不同的是,在计算机领域,单等号“=”表示的是赋值操作,而双等号“==”才表示比较操作。