C Primer Plus第三章总结
关于整数和浮点数
关于整数的常用的关键词有:char、int 、long、longlong、unsigned……
浮点数常用的关键词有:double、float
关于浮点运算和整数运算:
浮点运算的值最好赋给一个浮点数,否则会造成精度丢失。
注意:如果想用整数做浮点运算的话,请使用强制转换或者给相应的运算式乘一个1.0(浮点数),
并且运算的结果请用浮点数变量存储:(具体请看代码注释)
eg:
#include<stdio.h> int main(void) { //第一种 double c1,a,b; int c2; printf("----------第一种---------- "); scanf("%lf%lf",&a,&b); c1=a/b; c2=a/b; printf("c1 = %lf , c2 = %d ",c1,c2);//c2的精度会丢失,这种做法是错误的 //第二种 printf("----------第二种---------- "); int d1,x,y; double d2; scanf("%d%d",&x,&y); d1=x/y; d2=x/y; printf("直接处理:d1 = %d , d2=%lf ",d1,d2);//你会发现d2除去小数0,它们的值是一样的 //这个时候有两种操作方式 //第一种操作方式 d2=(double)x/y;//这种就是强制转换,把本来是int类型的x转换为double类型,然后整个运算式都会使用double类型计算(低精度转高精度) printf("第一种操作方式:d1 = %d , d2=%lf ",d1,d2);//你会发现d1和d2不一样了 //这个时候我们再让d2=1,然后实现第二种操作方式。 d2=1.0;//我们让d2的值归1 d2=x*1.0/y;//第二个处理整数除法的精度问题,我们通过给运算式乘1.0让运算式向高精度转换 //注意别把1.0放在最后,不然运算的时候会先用int计算x/y再乘1.0这样就不能让x/y变成浮点运算了 printf("第二种操作方式:d1 = %d , d2=%lf ",d1,d2);//你会发现d1和d2不一样了 return 0; }
效果:
关于小数精度问题,细心的同学可能发现了写代码的时候我们定义的小数或者是运算的小数可能和预期不一样,其实这牵涉到小数再内存中存储的问题,
当我们存储一个小数的时候超过了一定的范围的时候就会有精度丢失,这是由于计算机存储小数的方式造成的,想深究的同学可以有时间看看下面的这篇博客,讲的很棒(虽然我没看)
一般我们知道小数会有精度丢失的这一特点就行。
关于变量的初始化问题
我们一般都说变量在使用前最好有初始化,那这是为什么呢。
地球人都知道变量没初始化就用,那种变量没有意义,那么没初始化的变量会输出什么呢?
#include<stdio.h> int main(void) { int a; double b; char c; printf("a = %d b = %lf c=%c ",a,b,c); //选取了几个代表的类型 return 0; }
于是我们知道了未初始化的变量不是不能使用,于是我们猜测这些值都是系统随机生成的(事实也是如此)
那我们就会想是不是每一次程序运行都会让变量的值改变于是……
我们发现这三个变量的值根本没有变化,这是为什么呢?
因为声明了的变量之后,变量的地址就不会改变,无论程序运行多少遍或者编译器重启多少次变量的值都不会改变
但是如果再在下面定一个新的变量就可能会不一样,一般来说没有初始化就参与运算的变量是很危险的,
有些编译器就会警告你变量没有初始化就使用,甚至有些编译器会禁止运行。
关于转义符
先放一个图叭:
常用的转义符其实并不多, 是换行, 是水平制表,a是一个很有意思的转移符,它能让你的电脑发出一个"蜂鸣的声音"(亲测有效hhh)
如果对字符感兴趣的同学也可以看看ASCII码。
关于unsigned方面的我不做过多讲解,还是说一下,unsigned表示的是无符号类型的,用于修饰一个变量通常放在int、long、char等关键词前面
作用是让变量的值没有负数,这是为什么呢,学过补码、反码的小可爱就会知道最前面的那一位二进制表示的是符号,而unsigned就是让前面那个符号位也拿来存储值。
再随手拉一个博客:
一下是CPP关于第三章的总结:
C有多种符号,基本数据类型分为两大类:整数类型和浮点数类型。通过未类型分配的存储量以及是有符号还是无符号(unsigned),区分不同的整数类型,最小的整数类型是char,
因为实现不同,可以是有符号char或者无符号char,即unsigned char或者signed char 。但是通常用char类型表示小整数时才这样说明。其他整数类型有short、int、long long、long类型。
C规定,后面的类型不能小于前面的类型。上述都是有符号类型,但是也可以用unsigned创建无符号类型的。
注意!C语言本身是没有bool(布尔)类型的,但是在C99的标准里面增加了_Bool类型,考试的话如果有问C语言有无bool值,答案是无,只有_Bool类型,_Bool是一种无符号类型,可以存储0或1分别表示false和true
再注意printf("");里面的被答应的变量不用加&,否则打印的是该变量的地址(以后学了指针,了解了计算机的地址就懂了)
-------------------------------------------
本来还想讲讲字符串和字符的,但是时间关系就先讲到这了。
Talk is cheap. Show me the code.