目录
引言
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的”故事“了,如果有错误或者不严谨的地方,希望读者能够不吝指教,当然,如果你觉得写的还不错,不要忘了点赞、收藏、关注哦!