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

news/2024/4/25 18:53:12/文章来源:https://blog.csdn.net/qq_64446981/article/details/130311101

目录

语句和表达式的概念

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){ //写法2if (x > -DBL_EPSILON && x < DBL_EPSILON) { //写法3printf("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.luyixian.cn/news_show_102300.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ERTEC200P-2 PROFINET设备完全开发手册(9-2)

9.2 运行AC1/AC4参考代码 修改源代码usrapp_cfg.h的宏为 #define EXAMPL_DEV_CONFIG_VERSION 44 编译后下载到评估板运行AC4示例程序 在TIA中导入GSDML-V2.35-Siemens-ERTEC200pApp44-20210623.xml。新建项目&#xff0c;添加PLC和Devkit设备。 按照如下图所示配置模块&am…

基于vfw的局域网语音聊天室系统源码论文

语音视频聊天 UDP套接字的运用 在实现语音视频聊天时,采用的是基于UDP套接字的点对点模式,而UDP面向的是无连接的数据服务,其套接字的使用如图10所示。 图10 UDP套接字的使用 视频的捕获 利用VFW接口&#xff0c;视频捕获可以分为以下几个步骤&#xff1a; 建立视频采集窗口…

stm32在SDIO模式下SD写入错误的问题

1、问题描述 使用FAT32 f_write 多次执行写操作时&#xff0c;会报FR_DISK_ERR错误&#xff0c;而且是刚开始写不报错&#xff0c;写几次后会一直报错。 设断点跟踪到HAL_SD_WriteBlocks中&#xff0c;在调用SDMMC_CmdWriteMultiBlock时&#xff0c;会报SDMMC_ERROR_TX_UNDERR…

【MYSQL】Java的JDBC编程(idea连接数据库)

1. 配置 &#xff08;1&#xff09;新建一个项目 &#xff08;2&#xff09;Build System 那里选择Maven,下一步Create &#xff08;3&#xff09;配置pom.xml文件 首先查看自己的MYSQL版本&#xff1a;进入MySQL命令窗口 我的MYSQL版本是8.0版本的. 下一步&#xff0c;…

C/C++占位符,%x和%p的区别

遇到的问题 今天遇到了一个很奇怪的问题&#xff0c;当使用malloc分配了一个堆空间后&#xff0c;分别尝试用cout和printf尝试打印该地址&#xff0c;出现了两个地址不一样的情况&#xff1a; int *pp (int*)malloc(10*sizeof(int)); *pp 1234; cout << pp << …

常用数据加密

一、加密和解密 1、 加密 数据加密的基本过程&#xff0c;就是对原来为明 的文件或数据按某种算法进行处理&#xff0c;使其成为不可读的一段代码&#xff0c;通常称为 “密文”。通过这样的途径&#xff0c;来达到保护数据不被 非法人窃取、阅读的目的。 2、解密 加密的逆…

2023年,人工智能和数据训练呈现哪些新趋势?

最近&#xff0c;多才多艺的“全能网友”ChatGPT一次次火出圈。未来人工智能将以多快的速度、发展到何种地步&#xff1f;人们已经开始坐下来认真地探讨和思考。 我们生活在这个日新月异的时代。新的一年&#xff0c;人工智能的真正能力和应用场景又发生了哪些演进&#xff1f;…

Java性能优化之序列化优化

1、Java 序列化及其缺陷 Java 提供了一种序列化机制&#xff0c;这种机制能够将一个对象序列化为二进制形式&#xff08;字节数组&#xff09;&#xff0c;用于写入磁盘或输出到网络&#xff0c;同时也能从网络或磁盘中读取字节数组&#xff0c;反序列化成对象&#xff0c;在程…

java Excel清除表格条件格式规则

© Ptw-cwl 目录 文章目录 目录Excel清除表格条件格式规则1.开始 -> 条件格式2.条件格式 -> 清除规则3.管理规则也能删除 代码报java.lang.IllegalArgumentException: Specified CF index 43 is outside the allowable range (0..42)如何解决源码 Excel清除表格条件…

GitHub 开源神器 Bark模型,让文本转语音更简单

今天跟大家分享一个文本转语音的开源模型&#xff1a;Bark Bark 是由Suno创建的基于转换器的文本到音频模型。Bark 可以生成高度逼真的多语言语音以及其他音频 - 包括音乐、背景噪音和简单的音效。该模型还可以产生非语言交流&#xff0c;如大笑、叹息和哭泣。 该项目刚开源不…

JQuery-原理示意图-- 选择器-- 选择器综合代码--jQuery 的 DOM 操作--增删改查节点--常用遍历节点方法--多选框应用--全部综合代码

目录 JQuery 基本介绍 jQuery 的原理示意图 JQuery 基本开发步骤 说明: jQuery简单示例 jQuery 对象和 DOM 对象 什么是 jQuery 对象 DOM 对象转成 jQuery 对象 应用实例 jQuery 对象转成 DOM 对象 代码演示 jQuery 选择器 jQuery 选择器介绍 jQuery 选择器的优…

根据cadence设计图学习硬件知识 day03 了解 一些芯片 和 数据手册下载的地方

1. MT53D512M32D2DS 芯片&#xff08;动态随机存取存储器&#xff09;的技术指标 1.1 16n Prefetch (预加载) (n --芯片位宽) DDR 体系 链接&#xff1a;DDR扫盲—-关于Prefetch(预取)与Burst(突发)的深入讨论_ddr prefetch_qq_25814297-npl的博客-CSDN博客 1.2 每个通…

webhub123 前端技术社区和技术交流学习网站导航

整理了学习前端技术可以参考学习和技术交流的一些网站集合&#xff0c;全部收录到 webhub123 前端技术社区和技术交流学习网站导航http://​www.webhub123.com/#/home/detail?projectHashid30929575&ownerUserid22053727 整理后的效果如下&#xff0c;我们已经按照不同类…

【Springboot系列】Springboot整合Swagger3不简单

1、缘由 Swagger是一个根据代码注解生成接口文档的工具&#xff0c;减少和前端之间的沟通&#xff0c;前端同学看着文档就可以开发了&#xff0c;提升了效率&#xff0c;之前很少写swagger&#xff0c;这次自己动手写&#xff0c;还是有点麻烦&#xff0c;不怎么懂&#xff0c;…

vue3中其他的变化

1.全局API的转移 Vue 2.x 有许多全局 API 和配置。 - 例如&#xff1a;注册全局组件、注册全局指令等。 //注册全局组件 Vue.component(MyButton, {data: () > ({count: 0}),template: <button click"count">Clicked {{ count }} times.</button> …

[读书笔记] 从问题和公式角度理解 Diffusion Model

[小全读书笔记] 从问题和公式角度理解 Diffusion Model 1. Diffusion Model的结构1.1 定义与限制1.2 定义与限制的数学体现 2. Diffusion Model的模型训练2.1 似然函数转换成ELBO2.2 拆解ELBO2.3 求解关键&#xff1a; q ( x t − 1 ∣ x t , x 0 ) q(x_{t-1}|x_t,x_0) q(xt−1…

CompletableFuture的基本使用和原理

CompletableFuture CompletableFuture是对Future的扩展和增强。CompletableFuture实现了Future接口&#xff0c;并在此基础上进行了丰富的扩展&#xff0c;完美弥补了Future的局限性&#xff0c;同时CompletableFuture实现了对任务编排的能力。借助这项能力&#xff0c;可以轻…

web事件循环

事件循环的应用&#xff1a;计时器 promise ajax node 单线程是异步产生的原因&#xff0c;事件循环时异步的实现方式 1.浏览器进程模型 进程&#xff1a;程序运行需要自己专属的内存空间&#xff0c;可以把这块内存空间简单的理解为进程。 每个应用至少又一个进程&#xff…

模板方法设计模式解读

目录 豆浆制作问题 模板方法模式基本介绍 基本介绍 模板方法模式的原理类图 模板方法模式解决豆浆制作问题 应用实例要求 思路分析和图解(类图) 模板方法模式的钩子方法 模板方法模式的注意事项和细节 豆浆制作问题 编写制作豆浆的程序&#xff0c;说明如下: 1) 制作豆…

【LeetCode】剑指 Offer 67. 把字符串转换成整数 p318 -- Java Version

题目链接&#xff1a;https://leetcode.cn/problems/ba-zi-fu-chuan-zhuan-huan-cheng-zheng-shu-lcof/ 1. 题目介绍&#xff08;67. 把字符串转换成整数&#xff09; 写一个函数 StrToInt&#xff0c;实现把字符串转换成整数这个功能。不能使用 atoi 或者其他类似的库函数。 …