1.布尔变量和零值比较
假设布尔变量名字为flag,它和零值比较的标准if语句如下:
if(flag)
//表示flag为假if(!flag)
//表示flag为真根据布尔类型(boolean)的语义,0为假,任何非零值都是真。
可用TRUE和FLASE来表示”真“和”假“的两个概念。语言实现必须通过可比的值来区分二者,比如0和非0就可以担当此任。但是TRUE的值究竟是什么并没有统一的标准。
所以,不要将布尔变量flag直接与TRUE或者1、-1、0等进行比较。下列if语句都属于不良的用法:
if(flag != TRUE)
//错误用法if(flag == TRUE)
//错误用法if(flag == 1)
//错误用法if(flag != 1)
//错误用法if(flag == 0)
//不良用法,让人误以为flag是整数if(flag != 0)
//不良用法,让人误以为flag是整数2.整型变量和零值比较假设整型变量为value,它与零值比较的标准if语句如下:
if(value == 0)
if(value != 0)
不可用模仿bool变量的风格而写成:
if(value)
//会让人误以为value是布尔变量if(!value)
3.浮点数和零值比较计算机表示浮点数(float和double类型)都有一个精度限制。对于超出了精度限制的浮点数,计算机会把它们的精度之外的小数部分截断。因此本来不相等的两个浮点数在计算机中就可能变成相等的了。
例如:
float a=10.22222225,b=10.22222229;
在数学上a和b不相等,但是在32位计算机中它们是相等的。
那么如何对两个浮点数进行比较?如果两个同符号浮点数之差的绝对值小于或等于某一个可接受的误差(即精度),就认为它们是相等的,否则就是不相等的。
两个浮点数是否相等正确的比较方式:
if( fabs(x-y) <= EPSILON )
//x等于y if( fabs(x-y) > EPSILON )
//x不等于y同理,浮点数x和零值是否相等的正确比较方式:
if( fabs(x) <= EPSILON )
//x等于0 if( fabs(x-y) > EPSILON )
//x不等于0虽然不建议直接使用==和!=比较浮点数,但是可以直接比较浮点数谁大谁小,即可将
“<”和
“>”直接应用于浮点数之间的比较以及浮点数和整数的比较。
例子程序:编译环境VC6.0
****************************************test.c***************************************************
#include
#include
#define EPSILON 0.000000001
int main()
{
double a = 10.22222225;
double b = 10.22222222;
double c = 0.0000001;
if ( fabs(a-b) <= EPSILON )
{
printf("a:%.12f == b:%2.12f, 精度为%.12f \n",a,b,EPSILON);
}else
{
printf("a:%.12f != b:%2.12f, 精度为%.12f \n",a,b,EPSILON);
}
if (fabs(c) <= EPSILON)
{
printf("c:%.12f == 0, 精度为%.12f \n",c,EPSILON);
}else
{
printf("c:%.12f != 0, 精度为%.12f \n",c, EPSILON);
}
return 0;
}
*************************************************************************************************
运行结果:当精度为小数点后10位,a和b不相等,c和零不相等
4.指针变量与零值比较
指针变量的零值是空值NULL,即不指向任何对象。尽管NULL的值与0相同,但是两者的意义不同。
#ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void *)0)
假设指针变量的名字为p,它与零值比较的标准if语句如下:
if( p == NULL )
//p和NULL显示比较,强调p是指针变量if( p != NULL )
而不要写成:
if( p == 0 )
//容易让人误认为p是整形变量if(p != 0 )
更不要写成:
if( p )
//容易让人误认为p是布尔变量if( !p )
阅读(2700) | 评论(0) | 转发(0) |