【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>。


相关文章
|
12月前
|
数据可视化
利用数据可视化工具处理数据异常的具体流程是什么?
利用数据可视化工具处理数据异常的具体流程是什么?
415 60
|
机器学习/深度学习 vr&ar Python
R语言用logistic逻辑回归和AFRIMA、ARIMA时间序列模型预测世界人口
R语言用logistic逻辑回归和AFRIMA、ARIMA时间序列模型预测世界人口
|
机器学习/深度学习 人工智能 算法
【机器学习】平均绝对误差 (MAE) 与均方误差 (MSE) 有什么区别?
【5月更文挑战第17天】【机器学习】平均绝对误差 (MAE) 与均方误差 (MSE) 有什么区别?
|
17天前
|
存储 弹性计算 人工智能
【2025云栖精华内容】 打造持续领先,全球覆盖的澎湃算力底座——通用计算产品发布与行业实践专场回顾
2025年9月24日,阿里云弹性计算团队多位产品、技术专家及服务器团队技术专家共同在【2025云栖大会】现场带来了《通用计算产品发布与行业实践》的专场论坛,本论坛聚焦弹性计算多款通用算力产品发布。同时,ECS云服务器安全能力、资源售卖模式、计算AI助手等用户体验关键环节也宣布升级,让用云更简单、更智能。海尔三翼鸟云服务负责人刘建锋先生作为特邀嘉宾,莅临现场分享了关于阿里云ECS g9i推动AIoT平台的场景落地实践。
【2025云栖精华内容】 打造持续领先,全球覆盖的澎湃算力底座——通用计算产品发布与行业实践专场回顾
|
9天前
|
云安全 人工智能 安全
Dify平台集成阿里云AI安全护栏,构建AI Runtime安全防线
阿里云 AI 安全护栏加入Dify平台,打造可信赖的 AI
|
12天前
|
人工智能 运维 Java
Spring AI Alibaba Admin 开源!以数据为中心的 Agent 开发平台
Spring AI Alibaba Admin 正式发布!一站式实现 Prompt 管理、动态热更新、评测集构建、自动化评估与全链路可观测,助力企业高效构建可信赖的 AI Agent 应用。开源共建,现已上线!
1056 35
|
11天前
|
机器学习/深度学习 人工智能 搜索推荐
万字长文深度解析最新Deep Research技术:前沿架构、核心技术与未来展望
近期发生了什么自 2025 年 2 月 OpenAI 正式发布Deep Research以来,深度研究/深度搜索(Deep Research / Deep Search)正在成为信息检索与知识工作的全新范式:系统以多步推理驱动大规模联网检索、跨源证据。
816 56
下一篇
开通oss服务