对话谭浩强第三章1
文章目录
写在前面
好多人都说谭浩强的C语言书不行,这一点笔者不敢苟同。其实C语言是一门计算机技术,是日新月异的。现在哪本关于C语言的书没点小错误?书出版了就不能再小改,这是书的弊病。
所以现在学技术主流的渠道还是看视频,但是书的好处就是,有一些细枝末节可以照顾到。所以笔者此行的目的就是重新对话谭浩强老师,拣拾一般会漏掉或者是略去的琐碎知识点。欢迎和笔者一同重新探索谭浩强老师的经典吧。
如果这一小节没有我认为细小知识点的话,笔者就会略去,只留下大纲,相当于思维导图吧 ^_^
第三章 最简单的C程序设计——顺序程序设计
数据的表现形式及其运算
常量和变量
常量
-
整型常量
-
实型常量
- 十进制小数形式
- 指数形式
-
规定以字母e或E代表以10为底的指数
-
e前必须有数字,e后必须为整数
不能写出
e4
或3e2.5
的形式 -
字符常量
- 普通字符
单引号只是界限符,字符常量不包含界限符
- 转义字符
-
字符串常量
同样,双引号也只是界限符,字符串常量不包含界限符
-
符号常量
- #define定义的常量
变量
变量代表的是一个有名字的、具有特定属性的一个存储单元。它用于存放数据,也就是存放变量的值。
变量名实际上是以一个名字代表的一个存储地址。
在对程序编译组建时,由编译系统给每一个变量名分配对应的内存地址。
从变量中取值,实际上是通过变量名找到相应的内存地址,从该存储单元中读取数据。
常变量
- 常变量与常量的异同?
- 常变量:有类型,有存储单元,只是const修饰不被允许改变其值。
- 常变量是有名字的不变量,常量是没有名字的不变量。
- 常变量与符号常量的区别
#define PI 3.1415926 //定义符号常量
const float pi=3.1415926//定义常变量
请问PI和pi有什么不同?
性质不同:
#define是预编译指令,用符号常量PI代表字符串3.1415926。
在预编译的时候进行字符替换,预编译后,符号常量就被销毁了。
所以符号常量不分配存储单元。
常变量占用存储单元,有变量名和值。
标识符
标识符只能由字母、数字和下划线三者组成,且第一个字符不可为数字。
数据类型
数据存放在存储单元中,它是具体存在的。
而且,存储单元是由有限个字节构成,所以其存放的数据也是有限的,不可能存放无穷大的数,也不可能存放循环小数。
类型不同,对数据分配的存储单元的安排也不同。
整型数据
整型数据的分类
整型数据的存储方式:用整数的二进制补码形式存放。
正数的补码:此数的二进制形式。
负数的补码:此数的绝对值的补码,然后所有位按位取反,再+1。
正数的二进制存储单元中,最左一位用于表示符号,0代表正数,1则为代表负数。
int数据取值范围为 -231 ~ 231-1
unsigned int数据的取值范围为0 ~ 232
有符号的整型数据存储单元中最高位代表数值的符号。
如果指定unsigned型,存储单元中全部二进制位都用于存放数值本身,而没有符号。
所以无符号数只能存放正数,也正因如此,无符号数的范围比有符号整型中正数的范围大一倍。
只有整型(包括字符型)数据可以加signed或unsigned修饰,实型数据不能加。
%u是无符号数十进制的格式输出符。
sizeof(short)≤sizeof(int)≤sizeof(long)≤sizeof(long long)
整型变量的符号属性
类型 | 取值范围 |
---|---|
int | − 2 32 -2^{32} −232 ~ ( 2 32 − 1 ) (2^{32}-1) (232−1) |
unsigned int | 0 0 0 ~ ( 2 32 − 1 ) (2^{32}-1) (232−1) |
无符号整型与有符号整型数据都是4个字节,所有范围大小都是一样的。
但无符号数只有正数,所有无符号数范围是有符号数的正数范围的两倍。
字符型数据
字符与字符代码
字符为什么都分配1个字节呢?
ACSII字符集共有127个字符,故字符的ACSII码最多用7个二进制位表示。 2 7 − 1 = 127 2^7-1=127 27−1=127
所以字符型数据仅用1个字节(8个bit)就可以全部表示。
字符变量
字符变量也属于整型,也可以用signed和unsigned修饰。
浮点型数据
为何带小数点的实数叫浮点数呢?
在C语言中,实数是以指数形式存放在存储单元中的。
一个实数可以以不同的形式表现为指数,如:3.14 × 1 0 0 = 0.314 × 1 0 1 = 0.03.14 × 1 0 2 = . . . 3.14×10^0=0.314×10^1=0.03.14×10^2=... 3.14×100=0.314×101=0.03.14×102=...
这样由于指数的有效部分的小数点可以浮动,故我们把实数的指数形式称为浮点数。
float型
浮点数在存储时,系统将其以规范化的二进制数指数形式存放在存储单元中。
并分成小数部分和指数部分,分别存放。
有效部分将小数点移至开头,指数部分再补齐位置。
如浮点数3.14159,在内存中以如图形式存放。
该图是以10进制来示意的,实际上计算机是用二进制数来表示小数部分以及用2的次幂来表示指数部分的。
究竟用多少位来表示小数部分,多少位来表示指数部分,C标准中并未涉及,由各编译系统自定。
一般是用24位来表示小数,8位来表示指数。
小数部分占得位数越多,精度越高;指数部分占比越高,精度越低,但能表示的范围越大。
double型
为了扩大能表示的数的数值范围,用8个字节存储一个浮点数,可以得到15位有效数字。
其实为了高运算精度,程序进行浮点数计算时,自动将float型数据转为double型数据。
说明
有限的存储单元不可能完全精确地存储一个实数。
如float类型变量能存储的范围在:
[ − 3.4 × 1 0 38 , − 1.2 × 1 0 − 38 ] [-3.4×10^{38},-1.2×10^{-38}] [−3.4×1038,−1.2×10−38] ⋃ \bigcup ⋃ [ − 3.4 × 1 0 38 , − 1.2 × 1 0 − 38 ] [-3.4×10^{38},-1.2×10^{-38}] [−3.4×1038,−1.2×10−38]
long double型
怎样确定常量的类型
可以在常量的末尾加上专用字符,强制指定常量的类型。
若表示为float型常量,可以在其后加上F或f;
同理,加上L或l表示此常量为long double/int型的。
flaot a = 3.14159f;
long double a = 1.23L;
运算符和表达式
C 运算符
基本的算术运算符
自增(++)、自减(–)运算符
- ++,-- 运算符易造成混淆,故需谨慎使用,仅使用最简单的形式即可。
算术表达式和运算符的优先级与结合性
不同类型数据间的混合运算
- 混合运算时,系统自动将所有变量类型(包括整型,浮点型,字符型)全部转换成double型的,以提高运算精度。
强制类型转换运算符
- (类型)是最高级别运算符,在算式中最先被运算。