Chinaunix首页 | 论坛 | 博客
  • 博客访问: 259202
  • 博文数量: 56
  • 博客积分: 1264
  • 博客等级: 中尉
  • 技术积分: 491
  • 用 户 组: 普通用户
  • 注册时间: 2011-07-19 15:16
文章分类

全部博文(56)

文章存档

2012年(10)

2011年(46)

分类: C/C++

2011-07-31 10:22:57

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和零不相等
和零值比较:布尔变量、整型变量、浮点变量、指针变量 - myswirl - myswirl

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 )
阅读(2726) | 评论(0) | 转发(0) |
0

上一篇:fedora用root用户登陆

下一篇:我的链结

给主人留下些什么吧!~~