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

来源:互联网 发布:淘宝网 枣夹核桃4斤装 编辑:程序博客网 时间:2024/05/01 16:08

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

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,右侧可以写成0.000001或者le-6
    if( fabs(x-y) > EPSILON )         //x不等于0

或者:if ((x >= -EPSINON) && (x <= EPSINON))
其中 EPSINON是允许的误差(即精度)


虽然不建议直接使用==和!=比较浮点数,但是可以直接比较浮点数谁大谁小,即可将“<”“>”直接应用于浮点数之间的比较以及浮点数和整数的比较。
例子程序:编译环境VC6.0
****************************************test.c***************************************************
#include <stdio.h>
#include <math.h>

#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 )
0 0
原创粉丝点击