learn_C_deep_5 (语句和表达式的概念、if语句的多种语法结构、C语言有没有布尔类型、“零值”的比较)

news2024/9/23 2:25:05

目录

语句和表达式的概念

if语句的多种语法结构

注释的便捷方法(环境vs)

if语句执行的过程

逻辑与&&   逻辑或||   运算关系的顺序

​编辑

C语言有没有布尔类型

C99标准

sizeof(bool)的值为多少? 

_Bool原码

BOOL、TRUE、FALSE

sizeof(BOOL)的值为多少?

 BOOL与bool的区别

“零值”的比较

        1.bool变量与“零值”比较

        2.float、double变量与“零值”比较 - (这里以double为例) 

了解fabs函数 

 两个精度定义


语句和表达式的概念

C语言中由一个分号;隔开的就是一条语句

printf("Hello!\n");

1+2;

C语言中,用各种操作符把变量连接起来,形成有意义的式子,就叫做表达式

1+2

if语句的多种语法结构

1.if语句

if(表达式)   
    语句;

2.if - else语句

if(表达式)    
    语句1;
else    
    语句2;

3.if - else if - else语句

//多分支    
if(表达式1)    
    语句1;
else if(表达式2)    
    语句2;
else    
    语句3;

注释的便捷方法(环境vs)

1.先按ctrl + k,再按ctrl + c

2.采用if(0)注释  --  不推荐

 同时我们还可以从上面得出一个结论:非0为真,0为假

if语句执行的过程

#include<stdio.h>
int main()
{
    int flag = 1;
    if (flag == 1)
        printf("hello world\n");
    return 0;
}

#include<stdio.h>
int isEmpty()
{
    printf("某种数据结构是否为空!\n");
    return 1;
}
int main()
{
    if ((isEmpty()) == 1)
        printf("yes\n");
    return 0;
}

1.先执行()中的表达式或者函数,得到真假结果
2.条件  判定功能
3.进行  分支功能

逻辑与&&   逻辑或||   运算关系的顺序

 总结:从左到右

C语言有没有布尔类型

        bool 类型只有两个值:true 和 false。上面我们写的if()语句中非0为真,0为假,是因为C语言没有提供bool类型,而且我们也知道if()只有是条件表达式为真我们才执行,所以我们一般都写if(1),而不写if(true)。

        当我们写if(true)或者定义bool类型的变量时,编译器也提示出来为定义的标识符,说明编译器不认识它们,证明C没有提供bool类型。

C99标准

         但其实C语言时是有bool类型的,只不过我们编译器目前采用的是C89 or C90的标准,而在C99中引入了_Bool类型,它是一个类型,不过在新增头文件stdbool.h中,被重新用宏写成了bool,为了保证C/C++兼容性。引入头文件stdbool.h,程序就没有错误了。

sizeof(bool)的值为多少? 

        在 C 语言标准中,bool 类型是由 stdbool.h 头文件引入的。bool 通常被定义为枚举类型,其中 false 的值为 0,true 的值为 1。因此,sizeof(bool) 的值在 C 语言标准中并没有规定。 一般情况下,sizeof(bool) 的大小应该是 1 字节,因为 bool 类型只需要存储一个二进制位(0 或 1)来表示 true 或 false。但是,具体的实现方式可能会因编译器和操作系统的不同而有所不同。

_Bool原码

BOOL、TRUE、FALSE

#include<stdio.h>
#include<windows.h>
int main()
{
    BOOL x = TRUE;
    x = FALSE;
}

 这里的BOOL实际上是一个重命名  -   typedef int BOOL; 这里我们可以证明一下

sizeof(BOOL)的值为多少?

 BOOL与bool的区别

我将BOOL转到定义后,发现开头有这么一串注释,这样他们的区别就很明显了。 

由上面的图片可以得到,BOOL是微软帮我们设计的,我们只能在微软的对应的开发工具才能使用BOOL,BOOL是微软的标准(不推荐,可移植性较差),而bool是通用的。

        总结:

                1.优先使用C90,就是我们之前用的非0为真,0为假。

                2.一定要使用bool类型,优先使用bool,不推荐BOOL(可移植性较差)。

“零值”的比较

        1.bool变量与“零值”比较

#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
    }

    写法三:
    //1.先执行()中的表达式,得到真假结果(true or false,逻辑结果) - 而这里的pass本身就是逻辑结果
    //2.条件  判定功能
    //3.进行  分支功能
    if (pass) { //推荐 - 直挂的反应出来了,flag是"bool"
        //TODO
    }
    system("pause");
    return 0;
}

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

        2.float、double变量与“零值”比较 - (这里以double为例) 

        我们接下来看这个代码,后面的注释是我们预测的输出。

#include <stdio.h>
int main()
{
    double x = 1.0;
    double y = 0.1;
    printf("%.50f\n", x - 0.9);//0.1
    printf("%.50f\n", y);//0.1
    if ((x - 0.9) == y) {
        printf("you can see me!\n");//输出you can see me!
    }
    else {
        printf("you can not see me!\n");
    }
    return 0;
}

但是当我们运行这个代码的时候,结果令我们大失所望呀。

 为什么呢?

这里我们将数值3.1打印50的精度,结果出现了一大堆意外的数字。

        这是因为浮点数在内存中存储,并不想我们想的,是完整存储的,在十进制转化成为二进制,是有可能有精度损失的。 注意这里的损失,不是一味的减少了,还有可能增多。浮点数本身存储的时候,在计算不尽的时候,会“四舍五入”或者其他策略。所以上面才会输出you can not see me!

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

        在 C 语言中,由于浮点数的精度问题,不能直接使用等于号(==)判断两个浮点数是否相等。通常使用以下方法来比较两个浮点数的大小关系:

        1.定义一个比较精度值 EPS,例如 1e-6,代表可接受的最小误差范围

        2.判断两个数之差(绝对值)是否小于等于精度值 EPS;

了解fabs函数 

        

        在 C 语言中,fabs 函数属于 math.h 头文件,因此在使用该函数前需要先包含 math.h 头文件。该函数返回一个 double 类型的值,可以用于计算浮点数的绝对值。 

当我们去改进程序后,我么发现就可以比较两个浮点数了。

 两个精度定义

我们发现我们定义1e-6(也就是0.000001),可能有时候设置的误差范围比较大导致判断错误,那么我们一个具体怎么设置这个值呢,那么此时C语言就提供了两个精度:

#include //使用下面两个精度,需要包含该头文件

DBL_EPSILON //double 最小精度

FLT_EPSILON //float 最小精度

转到定义后

         XXX_EPSILON是最小误差,是:XXX_EPSILON+n不等于n的最小的正数。 EPSILON这个单词翻译过来是'ε'的意思,数学上,就是极小的正数 。

 请问我们这样写会有问题嘛? -  问题是:要不要相等

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

 现在我们来回归主题:float、double变量与“零值”比较

#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) { //写法3
		printf("you can see me!\n");
	}
	else {
		printf("you can not see me!\n");
	}
	system("pause");
	return 0;
}

        总结:在 C 语言中,由于浮点数在计算机中存储的方式和精度限制的原因,不能直接使用等于号来判断两个浮点数是否相等,也不能直接判断浮点数是否等于 0.0,如果我们要比较,就需要形成一个极小的精度EPS,然后将这个数与0.0的差值的绝对值进行比较,这样我们才能判断float、double变量与“零值”的比较。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/452940.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

IT_开发提测标准规范

背景 公司 IT 规模小&#xff0c;开发提测质量差&#xff0c;流程不规范&#xff0c;导致测试任务重&#xff0c;于是推行 &#xff1a;IT_开发提测标准规范&#xff0c;正文如下&#xff1b;拟定开发提测标准规范后&#xff0c;测试与项目经理内部评审后&#xff0c;发至IT群…

低相位噪声链路调试分析

上图为原始状态,与项目结项评审指标差不多,确实存在几个噪声比较差的点。 频率分布大约在几Hz,20K,50K左右。 由于测试时由子卡进行输出,采用直接进行直接输出,以看出,明显的尖峰已经没有了,只剩下20K左右的尖峰,但是总体来说,效果很差,可能时单端输出的问题。试…

【SVN已解决】svn下载成功图标不显示解决方法

介绍 这里是小编成长之路的历程&#xff0c;也是小编的学习之路。希望和各位大佬们一起成长&#xff01; 以下为小编最喜欢的两句话&#xff1a; 要有最朴素的生活和最遥远的梦想&#xff0c;即使明天天寒地冻&#xff0c;山高水远&#xff0c;路远马亡。 一个人为什么要努力&a…

【小技巧】word文档编辑技巧(一)

文章目录 一、显示显示导航显示所有字符 二、格式格式-三级目录格式-文本格式-图格式-表格式-公式格式-参考文献 三、小技巧交叉引用连续交叉引用表/图目录等自动更新分节符设置页眉/页码word转pdf带导航 一、显示 显示导航 开启导航&#xff1a;视图->显示框->导航窗格…

《春琴抄》庭有枇杷树,今已亭亭如盖矣~

《春琴抄》庭有枇杷树&#xff0c;今已亭亭如盖矣~ 谷崎润一郎&#xff08;1886年7月24日&#xff5e;1965年7月30日&#xff09;&#xff0c;日本近代小说家&#xff0c;唯美派文学主要代表人物之一&#xff0c;《源氏物语》现代文的译者。 代表作有《刺青》《春琴抄》《细雪》…

客户体验的重要性和企业发展的紧密联系

近年来&#xff0c;随着企业数字化转型的加速&#xff0c;客户服务的意义越来越被人们所重视。客户服务的质量不仅直接影响到客户满意度和忠诚度&#xff0c;而且会间接影响到企业的品牌口碑和市场竞争力。然而&#xff0c;目前市面上的很多企业帮助中心搭建平台&#xff0c;可…

【油猴脚本】ChatGPT 智能 Prompts 提示词助手

chatGPT 插件脚本 中文 Prompt 训练对话框 ChatGPT 智能 Prompts 可以为你带来更好的使用体验助你训练好用的ChatGPT&#xff1a;添加快捷指令&#xff08;prompts&#xff09;新增&#xff1a;论文专家角色、支持自动发送、固定智能助手…还有更多需求可以到仓库Issues里发起…

Qt Quick - ScrollView

Qt Quick - ScrollView 使用总结 一、概述二、使用四、分级五、滚动条控制六、触摸vs.鼠标交互七、美化 一、概述 ScrollView 为用户定义的内容提供滚动功能。类似QScrollArea 的功能。 二、使用 第一个例子展示了ScrollView的最简单用法。 ScrollView {width: 200height: …

本周大新闻|MR头显或成WWDC23重头戏;PICO 4 Pro本周开售

本周XR大新闻&#xff0c;AR方面&#xff0c;彭博社Mark Gurman确认XR头显将成为WWDC重头戏&#xff0c;同时将兼容iPad应用&#xff1b;Inprentus将发布用于AR光波导方案的闪耀光栅工艺&#xff1b;富采展示0.12英寸蓝光Micro LED&#xff1b;锐思华创公布多层光波导PGU&#…

大数据技术之Kafka集成

一、集成Flume 1.1 Flume生产者 &#xff08;1&#xff09;启动Kafka集群 zkServer.sh startnohup kafka-server-start.sh /opt/soft/kafka212/config/server.properties & &#xff08;2&#xff09;启动Kafka消费者 kafka-console-consumer.sh --bootstrap-server 192…

Django框架之定义模型和表迁移

django3.0 定义表模型并通过定义好的模型实现源代码创建数据表。 概述 模型是一个用于表示数据的Python类&#xff0c;包含基本的数据字段和行为。 通常一个模型就代表一张数据库表。 模型继承自django.db.models.Model&#xff0c;模型的每一个属性代表一个数据的字段。 定…

SLAM面试笔记(2) - ORB-SLAM2

目录 1 四叉树实现特征点均匀化分布 2 Bow词袋模型 2.1 什么是词袋&#xff1f; 2.2 词袋在ORB-SLAM2中的作用 2.3 离线训练字典树流程 3 ORB-SLAM的跟踪方法 3.1 恒速模型跟踪 3.2 重定位跟踪 3.3 参考关键帧跟踪 持续更新中... 1 四叉树实现特征点均匀化分布 参考…

SpringBoot实战(十六) 集成Hystrix

目录 一、简介1.Hystrix 的定义&#xff1f;2.Hystrix 的用处&#xff1f;3.Hystrix 的三种状态&#xff1f;4.Hystrix 解决什么问题&#xff1f;5.Hystrix 的设计原理&#xff1f;6.Hystrix 的实现原理&#xff1f; 二、集成 Hystrix1.Maven 依赖2.application.yml简易版&…

【CSS3】CSS3 伪元素选择器 ( 伪元素选择器语法简介 | 伪元素选择器权重计算 | 代码示例 )

文章目录 一、CSS3 伪元素选择器二、CSS3 伪元素选择器权重二、代码示例 一、CSS3 伪元素选择器 CSS3 伪元素选择器 : ::before 选择符 : 在 指定的标签元素内部的 前面 插入内容 ;::after 选择符 : 在指定的标签元素内部的 后面 插入内容 ; CSS3 伪元素选择器注意事项 : con…

QT里的网络通信简介

QTcpSocket类简介 QTcpSocket类提供了一个TCP套接字。TCP&#xff08;传输控制协议&#xff09;是一种可靠的、面向流的、面向连接的传输协议。它特别适合数据的连续传输。QTcpSocket是QAbstractSocket的一个子类&#xff0c;它允许您建立TCP连接和传输数据流。有关详细信息&a…

连接器信号完整性仿真教程 二

在连接器信号完整性仿真教程一中Step by Step演示了如何进行连接器信号完整性仿真&#xff0c;看完这片博文后应该可以做类似产品的仿真。如果说&#xff0c;看了这篇博文就学会了连接器信号完整性仿真&#xff0c;那就有点过了。有人也许会说信号完整性仿真难学&#xff0c;不…

利用GPT2 预测 福彩3d预测

使用GPT2预测福彩3D项目 个人总结彩票数据是随机的,可以预测到1-2个数字,但是有一两位总是随机的 该项目紧做模型学习用,通过该项目熟练模型训练调用生成过程. 福彩3D数据下载 https://www.17500.cn/getData/3d.TXT data数据格式 处理后数据格式 每行 2023 03 08 9 7 3 训…

Java入门教程||Java 继承||Java 重写(Override)与重载(Overload)

Java 继承 继承是所有 OOP 语言和 Java 语言不可缺少的组成部分。 继承是 Java 面向对象编程技术的一块基石&#xff0c;是面向对象的三大特征之一&#xff0c;也是实现软件复用的重要手段&#xff0c;继承可以理解为一个对象从另一个对象获取属性的过程。 如果类 A 是类 B …

玩机搞机----mtk芯片机型 另类制作备份线刷包的方式 读写分区等等

前面分享了几期高通和mtk芯片机型备份字库的几种方法教程。这些针对与很多没有线刷包资源的手机机型玩机操作。前面对接一个友商的mtk芯片杂牌机。和另外一个国外mtk芯片级都是来制作线刷包。因为&#xff0c;这些机型没有固件流出。而同一批机型中安卓版本高低不固定。支持的资…

谷歌TAG警告说俄罗斯黑客在乌克兰进行网络钓鱼攻击

与俄罗斯军事情报机构有关的精英黑客与针对乌克兰数百名用户的大批量网络钓鱼活动有关&#xff0c;以提取情报并影响与战争有关的公共言论。 谷歌的威胁分析小组&#xff08;TAG&#xff09;正在监测这个名为FROZENLAKE的行为者的活动&#xff0c;该小组表示&#xff0c;这些攻…