【C深剖】三组典型C题+float在if中的比较

简介: 【C深剖】三组典型C题+float在if中的比较

前言:

本节博客继续前篇C进阶深度解剖来分析关键字相关内容。

1.上节练习题分析

T1:

#include <stdio.h>
#include <windows.h>
int main()
{
  char a[1000];
  int i;
  for (i = 0; i < 1000; i++)
  {
    a[i] = -1 - i;
  }
  printf("%d", strlen(a)); //strlen介绍,字符串认识,\0的认识
  return 0;
}

答案:255

解析:在分析之前,请大家注意数组a的类型是char类型。

所以char a里面存放的数值应该是-1、-2、-3、…-127、-128、127、126…3、2、10、-1、-2、-3、-4、-5…循环!

因为0是字符结束标志,也就自然答案是255咯。

T2:

#include <stdio.h>
#include <windows.h>
int main()
{
  int i = -20;
  unsigned int j = 10;
  printf("%d\n", i + j);
}

答案:-10

解析:

T3:

int main()
{
   unsigned int i;
  for (i = 9; i >= 0; i--) 
  {
    printf("%u\n", i);
  }
  return 0;
}

答案:死循环

解析:

2.if语句

if语句执行中的细则

一般来说,if语句执行分为三步:
1.先执行()中的表达式,得到真假结果(BOOL类型)
2.条件判定
3.进行分支功能

布尔类型介绍

布尔类型?这是C99中新增的一种类型,在C90中C标准并没有进行规定。

作用:只有0(false)或者1(true)两种情况,用来表示真假。

两套布尔类型规定:

1.C99标准(仅限于支持C99的编译器/平台):

bool类型,包含于头文件<stdbool.h>,真(true),假(false)

2.微软标准(仅限于微软产品系列):

不推荐使用,一是因为跨平台问题,二是因为实际上是微软规定的布尔类型是int类型。

BOOL类型,包含于头文件<windows.h>,真(TRUE),假(FALSE)

查看布尔类型所占内存大小:

#include<stdbool.h>
#include<windows.h>
int main()
{
  bool a = false;
  BOOL b = TRUE;
  printf("bool of the size if:%d\n", sizeof(a));
  printf("BOOL of the size if:%d\n", sizeof(b));
  return 0;
}

if新用法:注释(不推荐使用)

其实if语句也可以用作注释使用。

#include<stdbool.h>
#include<windows.h>
int main()
{
  bool a = false;
  BOOL b = TRUE;
  if (0)
  {
    printf("bool of the size if:%d\n", sizeof(a));
  }
  printf("BOOL of the size if:%d\n", sizeof(b));
  return 0;
}

这里不推荐使用,原因有两点:

1.虽然if(0)内的代码看似是注释了,但是计算机仍然要进行判断,参与反汇编转换,一直这样注释,其实一直没有注释掉,会降低计算机效率。

2.代码的可维护性比较差。

if的写法推荐

下面是三种if写法,推荐使用第一个

#include<stdbool.h>
int main()
{
  int flag = 1;
  if (flag)//鲜明方便
  {
    //...
  }
  if (flag == 0)//容易写成flag=0
  {
    //...
  }
  if (flag == false)//大部分编译器并不全面支持C99标准,大部分仍然是C89/C90为主
  {
    //...
  }
  return 0;
}

浮点数判断

我们都知道浮点数存到计算机中有可能会有精度问题。

所以,因为精度损失问题,两个浮点数绝对不能用==判断是否相等

比如:

int main()
{
  double d = 3.6;
  printf("%.50lf\n", d);
  return 0;
}

如果要拿来判断,可能会出现下面因为精度丢失问题而造成判断错误:

为了避免这种情况的发生,于是有一个办法,就是判断差不多相等,在误差范围内就可以判断为相等啦。

在C语言中,C标准规定最小的精度为DBL_EPSILON,这是一个宏定义,包含于头文件<float.h>。

所以上面代码,可以改成这样写:

#include<float.h>
#include<math.h>
int main()
{
  /*float d = 3.6;*/
  //printf("%.50lf\n", d);
  double x = 1.0;
  double y = 0.1;
  if (fabs(x - 0.9 - y) <= DBL_EPSILON)
  {
    printf("yes\n");
  }
  else
  {
    printf("oh,my god!\n");
  }
  return 0;
}

注:fabs是一个求绝对值库函数,包含头文件<math.h>。


相关文章
|
7月前
|
存储 编译器 C++
C++从遗忘到入门问题之float、double 和 long double 之间的主要区别是什么
C++从遗忘到入门问题之float、double 和 long double 之间的主要区别是什么
110 0
C/C++ 关于double和float两种类型的区别
C/C++ 关于double和float两种类型的区别
C/C++ 关于double和float两种类型的区别
|
9月前
|
存储 算法 C++
C++100-C++拓展002-float精度问题
C++100-C++拓展002-float精度问题
float与double精度丢失问题
float与double精度丢失问题
142 0
float和double的区别
float和double的区别
119 0
|
存储 Java
湖南大学Java编程题3. 计算int型二进制1的个数
湖南大学Java编程题3. 计算int型二进制1的个数
C#基础②——数据类型(decimal和float、double的区别)
double和float都是存小数的,为什么还要分两个,一个不就行了,那它们两个有哪些区别?
|
存储 安全 编译器
【为什么】选用int64_t而不是longlong
【为什么】选用int64_t而不是longlong
286 0
|
前端开发
less中使用calc计算高度注意事项
less中使用calc计算高度注意事项
|
JSON 数据格式 Python
python:将二维array of float32类型的数据转为float类型
最近在处理wrf数据时,需要将数据转换为json各式,但是json支持的数据类型与python有一些差别,对于一些例如风场的变量往往是float32的格式,而json文件支持的是float的格式,所以需要将其进行转换。
python:将二维array of float32类型的数据转为float类型