加载中…
个人资料
任家
任家
  • 博客等级:
  • 博客积分:0
  • 博客访问:1,038,500
  • 关注人气:50
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

C语言if判断是否为0的问题

(2013-03-09 07:31:11)
标签:

it

分类: 基础知识

C语言if判断是否为0的问题

        今天用IAR编译一个if(flag) else语句时经常会不执行某种条件的语句,(flag为int,char,long等类型)。发现编译的时候就不编译很多语句。一开始以为是编译器问题。因为我们经常都认为不等于0的数都认为是真,有些时候直接写if(flag)也能用。一些某明奇妙的问题都是由于我们代码不规范和不了解根本原因造成的。其实编译器有时会不编译者个问题的根本原因我还是不知道,不过绝对是由于以下说的不规范造成的。

【引用】和零值比较:布尔变量、整型变量、浮点变量、指针变量

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类型)都有一个精度限制。对于超出了精度限制的浮点数,计算机会把它们的精度之外的小数部分截断。因此本来不相等的两个浮点数在计算机中就可能变成相等的了。
例如:

const float EPSINON = 0.000001;
    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 )

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有