0
点赞
收藏
分享

微信扫一扫

【C与0的不解之缘】

大明宫 2022-03-17 阅读 53
p2plinqgnu

目录

引言

 bool 变量与"零值"进行比较

bool类型—C99定义

BOOL类型—Microsoft专利​

C中如何进行 bool 值与0比较呢?

float 变量与"零值"进行比较

范围精度比较

  两个精度定义

指针变量与“零值”进行比较

NULL, '\0', 0的整体理解​

强制类型转化

指针变量与“零值”进行比较的 if 语句

 写在最后:


引言

        0不管是在生活中还是在学习中都是十分常见的,这里我们先看一看关于0的历史沿革,然后再讨论C语言与0的”故事“

了解了0之后,我们进入正题:C语言与0的不解之缘


 bool 变量与"零值"进行比较

bool类型—C99定义

PS:理论上,表示真假,需要一个bit就够了,不过这个问题,还是要取决于编译器的理解。vs中认为是1个字节(其它编译器上就不一定是一个字节了)。那么问题来了,后面代码该怎么写?因为目前编译器对C99特性支持的并不全面,我们后面依旧默认使用C90的认识去编码即可,使用int表示真、假。具体要结合实际况情去定


BOOL类型—Microsoft专利

在vs中,光标选中BOOL,双击,可以看到转到定义,就能看到BOOL是什么

输出结果是4,因为在源代码中,是这么定义的:typedef int BOOL;  

这也就可以解释为什么结果是4了

这是什么情况?编译器竟然也能通过。

这都是Microsoft自己搞的一套BOOL值,我们这里不推荐使用,因为在其他编译器上可能会不通过,而bool是C99标准的,跨平台性比BOOL高,所以,后面万一要用bool,我们最好使用C99标准的。


C中如何进行 bool 值与0比较呢?

#include <stdio.h>
#include <stdbool.h>
#include <windows.h>

int main()
{
 int pass = 0;   //0表示假,C90,我们习惯用int表示bool
    //bool pass = false;   //C99

 if (pass == 0){  //理论上可行,但此时的pass是应该被当做bool看待的,==用来进行整数比较,不推荐                             
    //TODO
    }

 if(pass == false){ //不推荐,尽管在C99中也可行
    //TODO
    } 

 if(pass){//推荐
    //TODO
    } 
    //理论上可行,但此时的pass是应该被当做bool看待的,==用来进行整数比较,不推荐
    //另外,非0为真,但是非0有多个,这里也不一定是完全正确的

 if (pass != 1){
   //TODO
   } 

 if(pass != true){ //不推荐,尽管在C99中也可行
   //TODO
   }

 if(!pass){ //推荐
  //TODO
  }
 
 system("pause");
 return 0;
}

结论:bool类型,直接判定,不用操作符进行和特定值比较。


float 变量与"零值"进行比较

这里比较复杂,要理清楚更细节的内容,需要知道浮点数在内存中的存储原理,大家如果不清楚的话可以移步到我的另外一篇博客“浮点型存储”。

  

那么两个浮点数该如何比较呢?应该进行范围精度比较


范围精度比较


伪代码如下:

if((x-y) > -精度 && (x-y) < 精度)
{
    //TODO
}

//伪代码-简洁版

if(fabs(x-y) < 精度)
{   
  //fabs是浮点数求绝对值
  //TODO
} 

#include<float.h>      //使用下面两个精度,需要包含该头文件
DBL_EPSILON        //double 最小精度
FLT_EPSILON        //float 最小精度

//代码调整后

#include <stdio.h>
#include <math.h> //必须包含math.h,要不然无法使用fabs
#include <float.h> //必须包含,要不然无法使用系统精度
#include <windows.h>

int main()
{
    double x = 1.0;
    double y = 0.1;
    printf("%.50f\n", x - 0.9);
    printf("%.50f\n", y);

    if(fabs((x - 0.9) - y) < DBL_EPSILON){ //原始数据是浮点数,我们就用DBL_EPSILON
        printf("you can see me!\n");
    } 

    else{
        printf("oops\n");
    }

    return 0;
}

  两个精度定义

double类型的精度定义

 float类型的精度定义

 



指针变量与“零值”进行比较

NULL, '\0', 0的整体理解

 上面三个打印结果是0,0,0,也就是说这NULL在数值上是等于0的;但是呢,他们本身的类型是不同的,在什么时候能体现出来呢?


强制类型转化


指针变量与“零值”进行比较的 if 语句


int * p = NULL;        //定义指针一定要同时初始化


 写在最后:

        以上就是C语言和0的”故事“了,如果有错误或者不严谨的地方,希望读者能够不吝指教,当然,如果你觉得写的还不错,不要忘了点赞、收藏、关注哦!

举报

相关推荐

0 条评论