各类型变量与“零值”比较
不同变量与零值比较方法不一样,但常常存在一些错误的用法。例如,把bool类型变量var与0的比较写成if(var == 0)
;把int型变量与零值比较写成if(!var)
;把指针变量var与零值的比较写成if(!var)
。虽然上述写法能正确运行,但未能清晰表达程序的意思。
正确的做法
-
一般地,如果想使用if一个变量var是真还是假,可以直接使用
if(var)
、if(!var)
,表明其为“逻辑判断” -
如果用if判断一个数值型变量var(如short、int、long等),应该用
if(var == 0)
,表明是与0进行数值上的比较 -
如果判断指针最好使用
if(var == NULL)
-
对于浮点数的比较,首先要考虑到浮点型变量在内存中的存储机制与整型不同,有舍入误差,导致它并不是一个精确的数。在判断浮点数相等时,推荐使用范围来确定,若x在某一范围内,就认为相等,范围的定义要根据实际情况而定,float和double也各有不同,所以都不可以用“==”或“!=”与任何数字比较,应该设法转化成“>=”或“<=”某个精度值。具体方式如下:
const float EPSINON = 0.00001;
if ((x >= EPSINON) && (x <= EPSINON))
这里EPSINON的取值是0.00001,而一般该值的选取按照实际情况设置。
需要注意的是,因为浮点数的精度误差,导致对于确切的两个浮点数a与b,a+b的值和b+a的值永远是相等的,而浮点数的运算是不可结合的,所以(a+b)+c的值和a+(b+c)的值就不一定相等了。