前言:
本节博客继续前篇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>。