if 语句的3种比较

  • bool 变量和 0 比较
  • 浮点数和 0 比较
  • 指针变量和 0 比较

首先我们知道 if 是用来判断真假的。
C语言中规定:0表示假,非0表示真。

if语句的执行过程如下

int main()
{int flag = 1;//1.先执行()中的表达式或某中函数,得到的布尔(真假)结果。//2.条件 判断分支//3.进行 分支功能if (1 == flag){printf("hello world\n");}else{printf("NO\n");}return 0;
}

什么是语句
C语言中由一个分号;隔开的就是一条语句。
比如:
printf("hehe);
1+2;
什么是表达式
C语言中,用各种操作符把变量连起来,形成有意义的式子,就叫做表达式。(非官方定义) 操作符:+,-,*,/,%,>,<,=,==...

bool 变量和 0 比较

深入理解C 中 bool

C语言有没有bool类型? c99之前,主要是c90是没有的,目前大部分书,都是认为没有的。因为书,一般都要落后于行业。
但是c99引入了_Bool类型(你没有看错,_Bool就是一个类型,不过在新增头文件stdbool.h中,被重新用宏写成了 bool,为了保证C/C++兼容性)。

测试代码1

#include <stdio.h>
#include <stdbool.h> //没有这个头文件会报错,使用新特性一定要加上int main()
{bool ret = false;ret = true;printf("%d\n", sizeof(ret));//vs2013 和 Linux中都是1return 0;
}

查看源码

#ifndef _STDBOOL
#define _STDBOOL#define __bool_true_false_are_defined 1#ifndef __cplusplus#define bool  _Bool //c99中是一个关键字哦,后续可以使用bool
#define false 0    //假
#define true  1    //真#endif /* __cplusplus */#endif /* _STDBOOL */

理论上,表示真假,需要一个bit就够了,不过这个问题,还是要取决于编译器的理解。vs2013中认为是1个字节。

注意:因为目前编译器对C99特性支持的并不全面,我们后面依旧默认使用C90的认识去编码即可,使用int表示真假。

VS版的布尔值
测试代码2

#include <windows.h> //VS版的要加这个头文件int main()
{ //在vs中,光标选中BOOL,单击右键,可以看到转到定义,就能看到BOOL是什么 BOOL ret = FALSE; ret = TRUE; printf("%d\n", sizeof(ret)); //输出结果是4,因为在源代码中,是这么定义的:typedef int BOOL;return 0;
}

微软的强烈不推荐,因为好的习惯是:一定要保证代码的跨平台性,微软定义的专属类型,其他平台不支持。(以后在语言 编程层面上,凡是直接使用和平台强相关的内容,我们都不推荐。(不是针对谁蛤)

关于跨平台性
我们可以看到上面测试代码1,和测试代码2 在vs2013下都能编过(微软系的), 但是在Linux中(centos 7),测试代码1,是可以编过的(因为是标准啊),但是测试代码2就过不了。

以后万一要用bool,强烈推荐C99标准的,摒弃微软
总结:

  1. 优先使用c90,就是我们之前以及后面一直用的方式
  2. 万一非得使用bool,推荐c99标准,不推荐MS自定义。
#include <stdio.h>
#include <stdbool.h>
int main()
{ int pass = 0; //0表示假,C90,我们习惯用int表示bool //bool pass = false; //C99if (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 }return 0;
}

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

浮点数和 0 比较

这里比较复杂,要理清楚更细节的内容,需要知道浮点数在内存中的存储原理.
请参考我之前写的博客
链接: 深度剖析数据在内存中的存储

浮点数在内存中存储,并不想我们想的,是完整存储的,在十进制转化成为二进制,是有可能有精度损失的。
注意这里的损失,不是一味的减少了,还有可能增多。浮点数本身存储的时候,在计算不尽的时候,会“四舍五入”或者其他策略
解释一下

#include <stdio.h> int main()
{ double x = 3.6; //浮点数在内存中默认是double的类型printf("%.50f\n", x); return 0;
}

int main()
{ double x = 1.0; double y = 0.1; printf("%.50f\n", x - 0.9); printf("%.50f\n", y); if ((x - 0.9) == y) { printf("you can see me!\n"); } else { printf("oops\n"); }return 0;
}

double x = 1.0;数据储存中先开辟空间,再有二进制,然后把二进制写到空间中。


结论: 因为精度损失问题,两个浮点数,绝对不能使用==进行相等比较.

浮点数比较
进行范围精度比较

int main()
{double x = 1.0; double y = 0.1; //伪代码 if((x-y) > -精度 && (x-y) < 精度){ //TODO }//伪代码-简洁版 if(fabs(x-y) < 精度)//fabs是浮点数求绝对值 { //TODO }return 0;
}

比较原理

精度: 可以自己设置,后面如果有需要,可以试试,通常是宏定义。或使用系统精度

#include <stdio.h>
#include <math.h> //必须包含math.h,要不然无法使用fabs
#include <float.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"); }system("pause"); return 0;
}

两个精度定义

#define DBL_EPSILON      2.2204460492503131e-016 // smallest such that 1.0+DBL_EPSILON != 1.0
#define FLT_EPSILON      1.192092896e-07F        // smallest such that 1.0+FLT_EPSILON != 1.0

XXX_EPSILON是最小误差,是:XXX_EPSILON+n不等于n的最小的正数。
EPSILON这个单词翻译过来是’ε’的意思,数学上,就是极小的正数 ----来自百度
另一种写法但是没上面的代码好,不推荐这样写

#include <stdio.h>
#include <math.h>
#include <float.h>
#include <windows.h>
int main()
{ double x = 0.00000000000000000000001; //if (fabs(x-0.0) < DBL_EPSILON) //写法1 //if (fabs(x) < DBL_EPSILON) //写法2 if(x > -DBL_EPSILON && x < DBL_EPSILON){  printf("you can see me!\n"); }else{printf("oops\n"); }return 0;
}

x > -DBL_EPSILON && x < DBL_EPSILON: 为何不是>= && <= 呢?

个人看法:XXX_EPSILON是最小误差,是:XXX_EPSILON+n不等于n的最小的正数。
XXX_EPSILON+n不等于n的最小的正数: 有很多数字+n都可以不等于n,但是XXX_EPSILON是最小的,but, XXX_EPSILON依旧是引起不等的一员。
换句话说:fabs(x) <= DBL_EPSILON(确认x是否是0的逻辑),如果=,就说明x本身,已经能够引起其他和他±的数 据本身的变化了,这个不符合0的概念

指针变量和 0 比较

int main()
{char arr = '\0';  //字符赋0int a = 0;        //数赋0int* pc = NULL;   //指针赋0printf("%d\n",0);printf("%d\n", '\0');printf("%d\n", NULL);//打印结果一样return 0;
}


结论: 能用操作符来连接起来的,操作符两边的类型必须是一样的。

if 语句的3种比较相关推荐

  1. pdo_fetch执行mysql_PDO中执行SQL语句的三种方法

    在PDO中,我们可以使用三种方式来执行SQL语句,分别是 exec()方法,query方法,以及预处理语句prepare()和execute()方法~大理石构件来图加工 在上一篇文章<使用PDO ...

  2. Oracle查询某一天日期数据的SQL语句的几种写法

    本文章向大家介绍Oracle查询某一天日期数据的SQL语句的几种写法,主要包括Oracle查询某一天日期数据的SQL语句的几种写法使用实例.应用技巧.基本知识点总结和需要注意事项,具有一定的参考价值, ...

  3. c语言格式字符If,C语言所有语句格式 C语言中的的if语句共有多少种格式?

    导航:网站首页 > C语言所有语句格式 C语言中的的if语句共有多少种格式? C语言所有语句格式 C语言中的的if语句共有多少种格式? 相关问题: 匿名网友: 1.if语句: if(Bool表达 ...

  4. php中用for循环制作矩形,PHP中for循环语句的几种变型

    PHP中for循环语句的几种变型 2021-01-22 10:21:42406 for语句可以说是PHP(同时也是多种语言)的循环控制部份最基本的一个语句了,for语句的执行规律和基础用法在这里就不多 ...

  5. PHP中for循环设计无穷循环,PHP中for循环语句的几种“变态”用法

    PHP中for循环语句的几种"变态"用法 for语句可以说是PHP(同时也是多种语言)的循环控制部份最基本的一个语句了,for语句的执行规律和基础用法在这里就不多说,可以参见PHP ...

  6. python中for语句只有一种写法for in_pythonforin语句

    Python中有一种语句 for i in range 还有for i range这两个句子怎么用 - # python中只有for i in range()语法,没有for i range() # ...

  7. 洛谷——P1597 语句解析(两种解法)

    P1597 语句解析(两种解法) 题目背景 木有背景-- 题目描述 一串长度不超过 255 的 PASCAL 语言代码,只有 a,b,c 3 个变量,而且只有赋值语句,赋值只能是一个一位的数字或一个变 ...

  8. python条件语句代码例子_Python 炫技操作:条件语句的七种写法

    原标题:Python 炫技操作:条件语句的七种写法 作者 | 写代码的明哥 责编 | 郭芮 有的人说 Python 入门容易,但是精通难的语言,这点我非常赞同. Python 语言里有许多(而且是越来 ...

  9. 32个c语言关键字发音,加注汉语发音的C语言32个语句和9种控制语

    加注汉语发音的C语言32个语句和9种控制语 一.C语言的关键字共有32个,根据关键字的作用,可分其为数据类型关键字.控制语句关键字.存储类型关键字和其它关键字四类. 1 数据类型关键字(12个): ( ...

  10. mysql中insert语句的五种用法

    文章目录 前言 一.values参数后单行插入 二.values参数后多行插入 三.搭配select插入数据 四.复制旧表的信息到新表 五.搭配set插入数据 总结 前言 insert语句是标准sql ...

最新文章

  1. jlink调试出现**JLink Warning: T-bit of XPSR is 0 but should be 1. Changed to 1错误
  2. 30行代码AC_HDU-5933 ArcSoft‘s Office Rearrangement(模拟+题解报告)
  3. util-C# 复杂条件查询(sql 复杂条件查询)查询解决方案
  4. 汽车电子专业知识篇(九)-charge pump的原理介绍
  5. 别了!Python之父!
  6. 算法原理与分析第二次作业
  7. 电商主题BANNER传统促销喜庆红色节日海报,C4D打造时尚场景
  8. halcon学习笔记——图像的预处理
  9. jquery效果插件网址
  10. 计算机专业教育经历怎么写,个人简历教育经历怎么写?
  11. [ExtJS] ExtJS颜色选择器
  12. 概率论和数理统计知识点总结
  13. 【流放之路-召唤愤怒狂灵攻略】
  14. 从跳频技术聊CDMA/WIFI之母海蒂·拉玛传奇的一生
  15. Android百度地图
  16. windows下断网启动程序
  17. Pandas的常用操作(一)
  18. 计算机数控系统cnc分类,数控机床系统有几种 数控系统的类型和分类
  19. Docker:docker 环境配置 python 版
  20. java 网络编程详细解析

热门文章

  1. 考试系统没有检测到C语言编程环境
  2. 计算机图形学 第10章 真实感图形
  3. 直播离“性”到底有多远? 李银河刷出新高度
  4. 强化学习入门-AI玩马里奥
  5. Unity序列帧动画——Sprite图片集制作UI动画
  6. kill billgates 杀死比尔盖茨在人心中的位置..
  7. ISC突波吸收电容的原理和设计
  8. LT3042EDD规格
  9. PHP学习(3)—在HTML中嵌入PHP
  10. 数据库查询报错无法创建有效参数 Cannot create Parameters