【C语言深度剖析——第五节(关键字5)】《C语言深度解剖》+蛋哥分析+个人理解

心态决定高度,细节决定成败
本文由@睡觉待开机原创,转载请注明出处。
本内容在csdn网站首发
欢迎各位点赞—评论—收藏
如果存在不足之处请评论留言,共同进步!

这里写目录标题

  • 1.上节练习题分析
    • T1:
    • T2:
    • T3:
  • 2.if语句
    • if语句执行中的细则
    • 布尔类型介绍
    • if新用法:注释(不推荐使用)
    • if的写法推荐
    • 浮点数判断

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

1.上节练习题分析

T1:

#include 
#include 
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类型。
【C语言深度剖析——第五节(关键字5)】《C语言深度解剖》+蛋哥分析+个人理解_第1张图片
【C语言深度剖析——第五节(关键字5)】《C语言深度解剖》+蛋哥分析+个人理解_第2张图片
【C语言深度剖析——第五节(关键字5)】《C语言深度解剖》+蛋哥分析+个人理解_第3张图片
所以char a里面存放的数值应该是-1、-2、-3、…-127、-128、127、126…3、2、10、-1、-2、-3、-4、-5…循环!
因为0是字符结束标志,也就自然答案是255咯。

T2:

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

答案:-10
解析:
【C语言深度剖析——第五节(关键字5)】《C语言深度解剖》+蛋哥分析+个人理解_第4张图片
【C语言深度剖析——第五节(关键字5)】《C语言深度解剖》+蛋哥分析+个人理解_第5张图片
【C语言深度剖析——第五节(关键字5)】《C语言深度解剖》+蛋哥分析+个人理解_第6张图片

T3:

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

答案:死循环
解析:
【C语言深度剖析——第五节(关键字5)】《C语言深度解剖》+蛋哥分析+个人理解_第7张图片

2.if语句

if语句执行中的细则

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

【C语言深度剖析——第五节(关键字5)】《C语言深度解剖》+蛋哥分析+个人理解_第8张图片

布尔类型介绍

布尔类型?这是C99中新增的一种类型,在C90中C标准并没有进行规定。
作用:只有0(false)或者1(true)两种情况,用来表示真假。
两套布尔类型规定:
1.C99标准(仅限于支持C99的编译器/平台):
bool类型,包含于头文件,真(true),假(false)
【C语言深度剖析——第五节(关键字5)】《C语言深度解剖》+蛋哥分析+个人理解_第9张图片
2.微软标准(仅限于微软产品系列):
不推荐使用,一是因为跨平台问题,二是因为实际上是微软规定的布尔类型是int类型。
BOOL类型,包含于头文件,真(TRUE),假(FALSE)
【C语言深度剖析——第五节(关键字5)】《C语言深度解剖》+蛋哥分析+个人理解_第10张图片

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

#include
#include
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;
}

【C语言深度剖析——第五节(关键字5)】《C语言深度解剖》+蛋哥分析+个人理解_第11张图片

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

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

#include
#include
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
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语言深度剖析——第五节(关键字5)】《C语言深度解剖》+蛋哥分析+个人理解_第12张图片
如果要拿来判断,可能会出现下面因为精度丢失问题而造成判断错误:
【C语言深度剖析——第五节(关键字5)】《C语言深度解剖》+蛋哥分析+个人理解_第13张图片
为了避免这种情况的发生,于是有一个办法,就是判断差不多相等,在误差范围内就可以判断为相等啦。

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

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

#include
#include
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是一个求绝对值库函数,包含头文件

你可能感兴趣的:(C语言进阶学习,c语言,开发语言)