不同类型的变量与零究竟是如何比较(2)

简介: 不同类型的变量与零究竟是如何比较

4.float 变量与"零值"进行比较  

我们知道浮点数在内存中存储,可能会有精度损失(注:这里的损失,不是一味的减少了,还有可能增多,浮点数本身存储的时候,在计算不尽的时候,会“四舍五入”或者其他 策略)


q1.png


4.1两个浮点数是否可以进行相等比较

从下面的图片代码中可以看出 x=1.0,y=0.1,那么进行 if 表达式判断时 x - 0.9 应该等于 0.1 ,0.1与 y 相等应当打印 1,但却打印了 0 ,这是为什么了?


q2.png


那我们接下来,来看看打印 x-0.9 和 0.1 打印的究竟是什么?  


原来内存中 x - 0.9 并不等于 0.1,而是精度损失了,而 y 也不是0.1,也精度损失了,所以上面代码的才没有打印 1

q3.png



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


4.2那么两个浮点数该如何比较呢?

应该进行范围精度比较

q4.png



注:fabs是浮点数求绝对值


如何设置精度?


自己用宏定义设置

使用系统精度

1.自己用宏定义设置精度

w1.png



2.使用系统精度  

w2.png



4.3 float 变量与 0 比较

#include<stdio.h>
#include<float.h>
#include<math.h>
int main()
{
  float x = 0.000000000000001f;//当数值足够小时,会被判断为0
  //if (fabs(x) < DBL_EPSILON)
  if (fabs(x-0) < DBL_EPSILON)
  {
  printf("1\n");
  }
  else
  {
  printf("0\n");
  }
  return 0;
}

5.指针变量与“零值”进行比较

5.1表示0的方法

我们之前学习过 数字0、转义字符 \0、空 NULL,它们也都可以表示0

w3.png



我们可以转到NULL定义,可以看到其实NULL就是0

w4.png



5.2指针变量与零比较

e1.png


6.else 到底与哪个 if 配对呢?

1.这个代码总是让人感觉它与第一个 if 匹配,其实它跟第二个 if 匹配,因为 else 采取的是就近原则,所以这个代码什么也都不打印


#include<stdio.h>
int main()
{
  int x = 0;
  int y = 1;
  if (10 == x)
  if (11 == y)
    printf("hi\n");
  else
  printf("hello\n");
  return 0;
}

2.这个才是正确的代码风格,一看就知道 else 与哪个 if 匹配


#include<stdio.h>
int main()
{
  int x = 0;
  int y = 1;
  if (10 == x)
  {
  if (11 == y)
        {
            printf("hi\n");
        }
  } 
  else
  {
  printf("hello\n");
  }
  return 0;
}

为什么 不写成 x==10,而写成10 == x?


答:因为这样写可以避免把==写成=,如果不小心写成=,我们知道赋值号的左边必须是变量,所以这属于语法错误,编译器会提示,那要是不小心写成了 x = 10,这就属于运行错误系统不会提示。


由此可知良好的编程风格对编程者是多么重要,养成良好的编程习惯,从你我做起。  


相关文章
|
6月前
|
存储 开发者
如何确定常量的类型
在编程中,常量是程序中值不会改变的量。确定常量的类型是非常重要的,因为它直接影响了程序的效率和可读性。选择正确的常量类型可以确保程序占用更少的内存,运行更快,并且更容易理解和维护。
66 2
|
存储
3.2.6 怎样确定常量的类型
3.2.6 怎样确定常量的类型
47 0
|
2月前
|
Shell
如何定义变量
【9月更文挑战第4天】
36 11
|
3月前
|
存储 编译器 C语言
数据类型与变量
数据类型与变量
53 3
|
4月前
|
存储 编译器
C 中的变量定义
【7月更文挑战第2天】C 中的变量定义。
29 3
|
5月前
|
存储 Java 程序员
|
6月前
|
存储 安全 编译器
C++数据类型与变量:深入理解与应用
C++数据类型与变量:深入理解与应用
|
6月前
|
存储 编译器
C中的变量定义
C中的变量定义。
30 0
|
6月前
|
存储 算法 编译器
C++002-C++变量和数据类型1
C++002-C++变量和数据类型1
C++002-C++变量和数据类型1
|
6月前
|
存储 算法 编译器
C++003-C++变量和数据类型2
C++003-C++变量和数据类型2