C语言的各类变量和零值的比较详解

目录
  • 1.波尔变量和零值比较
  • 2.整形变量和零进行比较
  • 3.浮点变量和零值比较
  • 4.指针和零值比较
  • 总结

1.波尔变量和零值比较

在C语言中本来是不存在bool类型的,但在C99标准中加入了bool类型。

在C99标准中引入了_Bool类型,在vs中将bool类型进行了宏定义,而_Bool类型使微软自己设计的一种类型,在别的编译器上不具有可移植性,故这里我们使用bool类型。

接下来我们进入我们的正题:

假设布尔变量名称为flag,那它与零值的比较在if语句中表示如下:

if(flag)          //表示flag为真

if(!flag)       //表示flag为假  

在C++标准中,布尔类型常量和整数、指针之间的转换规则为:

false->0 true->1

0->false true->非0值

但对于不同的实现对ture的表示也可以不同,所以我们要避免一下操作:

​
int flag = 1;
if(flag==ture){
   ;
}

​

因此以后在进行bool类型与零比较时,我们避免使用判断形式。

2.整形变量和零进行比较

假设整形变量为ret,它与零值进行比较的if语句可以表示为:

if(ret==0)   

if(ret!=0)

不可以写成bool的类型风格

if(ret)   //会让人错以为ret使bool类型

if(!ret)  

3.浮点变量和零值比较

这里也是我们今天所讲述的重点。

这里我们先来看一段代码:

在我们的看来,x和y不应该一样吗?为什么这里却有如此大的差别?

这里涉及到了浮点数的存数和缺失。

让我们在看一段代码:

 

在数学上我们认为这两个数使不相等的,但在32位计算器上认为这两个数是相等的。

所以我们如果两个同符号的浮点数的差的绝对值在一个范围内我们就认为这两个数使相等的,否则激素不相等的。所以我们应该怎样去实现呢?

代码如下:

我们引入了<math.h>和<float.h>两个头文件来实现我们的需求,这里我们引入了FLT_EPSILON 这个精度范围来比较两个float类型的数,除了这个精度范围还有DBL_EPSILON精度范围用来比较double类型,这里我们就不举例了。

4.指针和零值比较

指针变量的空为NULL,即不指向任何对象,尽管NULL和0值相同,但表达意义却不同。

假设指针变量为p,它与零值比较的if语句实现为:

if(p==NULL)        //p与NULL比较,来显示p使指针变量

if(p!=NULL)

 尽量避免写成如下形式

if(p)     //容易误解成bool类型变量

if(!p)

或者这种

if(p==0)   //容易误解成整形类型变量

if(p!=0)

这四类比较希望大家有所收获。

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注我们的更多内容!

(0)

相关推荐

  • C语言 变量详解及示例代码

    C 变量 变量其实只不过是程序可操作的存储区的名称.C 中每个变量都有特定的类型,类型决定了变量存储的大小和布局,该范围内的值都可以存储在内存中,运算符可应用于变量上. 变量的名称可以由字母.数字和下划线字符组成.它必须以字母或下划线开头.大写字母和小写字母是不同的,因为 C 是大小写敏感的.基于前一章讲解的基本类型,有以下几种基本的变量类型: 类型 描述 char 通常是一个八位字节(一个字节).这是一个整数类型. int 对机器而言,整数的最自然的大小. float 单精度浮点值. doub

  • C语言 指针变量作为函数参数详解

    在C语言中,函数的参数不仅可以是整数.小数.字符等具体的数据,还可以是指向它们的指针.用指针变量作函数参数可以将函数外部的地址传递到函数内部,使得在函数内部可以操作函数外部的数据,并且这些数据不会随着函数的结束而被销毁. 像数组.字符串.动态分配的内存等都是一系列数据的集合,没有办法通过一个参数全部传入函数内部,只能传递它们的指针,在函数内部通过指针来影响这些数据集合. 有的时候,对于整数.小数.字符等基本类型数据的操作也必须要借助指针,一个典型的例子就是交换两个变量的值. 有些初学者可能会使用

  • C语言的变量类型及内存大小详解

    类型 存储大小 值范围 c输入输出格式 具体范围 char 1byte(8位) -2^7 ~ 2^7-1 %c -128 到 127 unsigned char 1byte(8位) 0 ~ 2^8-1 %c 0 到 255 signed char 1byte(8位) -2^7 ~ 2^7-1 %c -128 到 127 short 2byte(16位) -2^15 ~ 2^15-1 %d -32,768 到 32,767 unsigned short 2byte(16位) 0 ~ 2^16-1

  • C语言 全局变量和局部变量详解及实例

    C语言 全局变量和局部变量详解 核心内容: 1.局部变量和全局变量 变量按照作用域分为:全局变量和局部变量 全局变量的作用域:从定义位置开始到下面整个程序结束. 局部变量的作用域:在一个函数内部定义的变量只能在本函数内部进行使用. OK,上面的效果用Java语言实现一下: public class App1 { public static int k = 10;//相当于全局变量 public static void main(String[] args) { int i = 10;//局部变量

  • C语言的各类变量和零值的比较详解

    目录 1.波尔变量和零值比较 2.整形变量和零进行比较 3.浮点变量和零值比较 4.指针和零值比较 总结 1.波尔变量和零值比较 在C语言中本来是不存在bool类型的,但在C99标准中加入了bool类型. 在C99标准中引入了_Bool类型,在vs中将bool类型进行了宏定义,而_Bool类型使微软自己设计的一种类型,在别的编译器上不具有可移植性,故这里我们使用bool类型. 接下来我们进入我们的正题: 假设布尔变量名称为flag,那它与零值的比较在if语句中表示如下: if(flag)   

  • Golang反射获取变量类型和值的方法详解

    目录 1. 什么是反射 2. reflect.Type 2.1 类型Type和种类Kind 2.2 引用指向元素的类型 2.3 结构体成员类型 3. reflect.Value 3.1 结构体的成员的值 3.2 遍历array.slice 3.3 遍历map 4. 反射的三大定律 4.1 从interface到反射对象 4.2 从反射对象到interface 4.3 通过反射修改对象,该对象值必须是可修改的 1. 什么是反射 反射是程序在运行期间获取变量的类型和值.或者执行变量的方法的能力. G

  • Golang语言的多种变量声明方式与使用场景详解

    目录 01介绍 02变量声明方式 标准声明变量 不显式赋初始值声明变量 省略类型声明变量 短变量声明 显式类型转换 变量列表声明 变量声明块 03使用场景 包级变量 全局变量 局部变量 04注意事项: 05总结 01介绍 在程序设计中,编译器必须将代表数据的变量名称替换成该数据所在的内存地址.变量的名称.类型及内存地址通常会维持固定,但该内存地址所存储的数据在程序执行期间则可能会改变. Golang 语言编译器需要先明确变量的内存边界,才可以使用变量.通过声明变量使用的类型,编译器可以明确变量的

  • C语言入门篇--变量的左值和右值

    目录 1.普通变量 2.指针变量 2.1初步理解 2.2深入理解 在看此块内容前可以先看看内存及地址相关内容,更容易理解. 1.普通变量 一个变量是有三个属性: 1.变量的空间. 2.变量的内容. 3.变量的地址. 空间即若干字节,内容即空间里放了什么,地址即变量对应的空间地址. #include <stdio.h> int main() { int a = 10;//定义变量a,开辟4个字节的空间. a = 20;//见下述文字解释 int b = a;//见下述文字解释 return 0;

  • Go语言基础变量的声明及初始化示例详解

    目录 一.概述 二.声明变量 三.编译器推导类型的格式[一定要赋值] 四.短变量声明并初始化 五.匿名变量--没有名字的变量 六.注意 七.案例 一.概述 变量的功能是存储用户的数据 二.声明变量 Go语言的每一个变量都拥有自己的类型,必须经过声明才能开始用 变量的声明格式: var <变量名称> [变量类型] var a int //声明一个整型类型的变量,可以保存整数数值 var b string //声明一个字符串类型的变量 var c float32 //声明一个32位浮点切片类型的变

  • C语言顺序表的基本结构与实现思路详解

    目录 一.顺序表的概念与结构 1.线性表的解释 2.顺序表概念解释 二.顺序表的思路及代码实现详解 1.静态顺序表的实现 2.动态顺序表思路及代码实现 2.1 动态顺序表的整体思路 2.2 定义结构体的实现 2.3 初始化结构体 2.4 结构体打印 2.5 检查数组容量 2.6 头插 2.7 尾插 2.8 头删 2.9 尾删 2.10 任意删除 2.11 任意插入 2.12 空间释放 三.顺序表代码整合 SeqList.h SeqList.c test.c 一.顺序表的概念与结构 1.线性表的解

  • JavaScript中变量提升和函数提升的详解

    第一篇文章中提到了变量的提升,所以今天就来介绍一下变量提升和函数提升.这个知识点可谓是老生常谈了,不过其中有些细节方面博主很想借此机会,好好总结一下. 今天主要介绍以下几点: 1. 变量提升 2. 函数提升 3. 为什么要进行提升 4. 最佳实践 那么,我们就开始进入主题吧. 1. 变量提升 通常JS引擎会在正式执行之前先进行一次预编译,在这个过程中,首先将变量声明及函数声明提升至当前作用域的顶端,然后进行接下来的处理.(注:当前流行的JS引擎大都对源码进行了编译,由于引擎的不同,编译形式也会有

  • [c++]变量声明与定义的规则详解

    声明与定义分离 Tips:变量能且仅能被定义一次,但是可以被多次声明. 为了支持分离式编译,C++将定义和声明区分开.其中声明规定了变量的类型和名字,定义除此功能外还会申请存储空间并可能为变量赋一个初始值. extern 如果想声明一个变量而非定义它,就使用关键字extern并且不要显式地初始化变量: extern int i; // 声明i而非定义i extern int i = 1; // 定义i, 这样做抵消了extern的作用 static 当我们在C/C++用static修饰变量或函数

  • C语言 数据结构之数组模拟实现顺序表流程详解

    目录 线性表和顺序表 线性表 顺序表 静态顺序表 动态顺序表 代码已经放在Gitee上,需要可以小伙伴可以去看看 用C语言数组模拟实现顺序表 Gitee 线性表和顺序表 线性表 线性表(linear list)是n个具有相同特性的数据元素的有限序列,这是我们广泛使用的数据结构. 线性表在逻辑上是线性结构,也就说是连续的一条直线.但是在物理结构上并不一定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式存储. 常见的线性表:顺序表.链表.栈.队列.字符串- 顺序表 顺序表是用一段物理地址连

  • C语言通过三步翻转法实现单词倒置详解

    目录 一.解题思路 二.完整代码与注释 三.代码剖析 1.实现字符串整体的翻转 2.一个单词的翻转 3.字符串中的每一个单词的翻转 一.解题思路 如何将一句话的单词倒置,而标点不倒置? 例如:I like beijing. 倒置成:beijing. like I 可以利用三步翻转法,先将整句话倒置,再将每个单词倒置.前面的例子中输入的内容有空格,如果使用 scanf() 函数的话,scanf 检测到空格后就停止录入了:所以要使用 gets() 函数,gets 可以直接录入一行,包括空格. 代码示

随机推荐