写在前面

​ 好多人都说谭浩强的C语言书不行,这一点笔者不敢苟同。其实C语言是一门计算机技术,是日新月异的。现在哪本关于C语言的书没点小错误?书出版了就不能再小改,这是书的弊病。

​ 所以现在学技术主流的渠道还是看视频,但是书的好处就是,有一些细枝末节可以照顾到。所以笔者此行的目的就是重新对话谭浩强老师,拣拾一般会漏掉或者是略去的琐碎知识点。欢迎和笔者一同重新探索谭浩强老师的经典吧。

​ 如果这一小节没有我认为细小知识点的话,笔者就会略去,只留下大纲,相当于思维导图吧 ^_^


第三章 最简单的C程序设计——顺序程序设计

数据的表现形式及其运算

常量和变量

常量
  1. 整型常量

  2. 实型常量

    • 十进制小数形式
    • 指数形式
    1. 规定以字母e或E代表以10为底的指数

    2. e前必须有数字,e后必须为整数

    不能写出e43e2.5的形式

  3. 字符常量

    • 普通字符

    单引号只是界限符,字符常量不包含界限符

    • 转义字符
  4. 字符串常量

    同样,双引号也只是界限符,字符串常量不包含界限符

  5. 符号常量

    • define定义的常量

变量

变量代表的是一个有名字的、具有特定属性的一个存储单元。它用于存放数据,也就是存放变量的值。

变量名实际上是以一个名字代表的一个存储地址

在对程序编译组建时,由编译系统给每一个变量名分配对应的内存地址。

从变量中取值,实际上是通过变量名找到相应的内存地址,从该存储单元中读取数据。

常变量
  1. 常变量与常量的异同?
  • 常变量:有类型,有存储单元,只是const修饰不被允许改变其值。
  • 常变量是有名字的不变量,常量是没有名字的不变量。
  1. 常变量与符号常量的区别
#define PI 3.1415926    //定义符号常量
const float pi=3.1415926//定义常变量

请问PI和pi有什么不同?

性质不同:

  1. define是预编译指令,用符号常量PI代表字符串3.1415926。

  2. 在预编译的时候进行字符替换,预编译后,符号常量就被销毁了。

  3. 所以符号常量不分配存储单元。

  4. 常变量占用存储单元,有变量名和值。

标识符

标识符只能由字母、数字和下划线三者组成,且第一个字符不可为数字。

数据类型

数据存放在存储单元中,它是具体存在的。而且,存储单元是由有限个字节构成,所以其存放的数据也是有限的,不可能存放无穷大的数,也不可能存放循环小数。类型不同,对数据分配的存储单元的安排也不同。

整型数据

整型数据的分类
  1. 基本整型(int型)

整型数据的存储方式:用整数的二进制补码形式存放。

正数的补码:此数的二进制形式。

负数的补码:此数的绝对值的补码,然后所有位按位取反,再+1。

正数的二进制存储单元中,最左一位用于表示符号,0代表正数,1则为代表负数。

int数据取值范围为-2^31^ ~ 2^31^-1

unsigned int数据的取值范围为0 ~ 2^32^

有符号的整型数据存储单元中最高位代表数值的符号。如果指定unsigned型,存储单元中全部二进制位都用于存放数值本身,而没有符号。所以无符号数只能存放正数,也正因如此,无符号数的范围比有符号整型中正数的范围大一倍。
只有整型(包括字符型)数据可以加signed或unsigned修饰,实型数据不能加。%u是无符号数十进制的格式输出符。
  1. 短整型
  2. 长整型
  3. 双长整型
sizeof(short)≤sizeof(int)≤sizeof(long)≤sizeof(long long)
整型变量的符号属性
类型 取值范围
int ~
unsigned int ~
无符号整型与有符号整型数据都是4个字节,所有范围大小都是一样的。
但无符号数只有正数,所有无符号数范围是有符号数的正数范围的两倍。

字符型数据

字符与字符代码

字符为什么都分配1个字节呢?

ACSII字符集共有127个字符,故字符的ACSII码最多用7个二进制位表示。

所以字符型数据仅用1个字节(8个bit)就可以全部表示。

字符变量

字符变量也属于整型,也可以用signed和unsigned修饰。

浮点型数据

为何带小数点的实数叫浮点数呢?

在C语言中,实数是以指数形式存放在存储单元中的。
一个实数可以以不同的形式表现为指数,如:

这样由于指数的有效部分的小数点可以浮动,故我们把实数的指数形式称为浮点数。
float型
浮点数在存储时,系统将其以规范化的二进制数指数形式存放在存储单元中。
并分成小数部分和指数部分,分别存放。
有效部分将小数点移至开头,指数部分再补齐位置。

如浮点数3.14159,在内存中以如图形式存放。

浮点型数据

该图是以10进制来示意的,实际上计算机是用二进制数来表示小数部分以及用2的次幂来表示指数部分的。
究竟用多少位来表示小数部分,多少位来表示指数部分,C标准中并未涉及,由各编译系统自定。
一般是用24位来表示小数,8位来表示指数。

小数部分占得位数越多,精度越高;指数部分占比越高,精度越低,但能表示的范围越大。

double型

为了扩大能表示的数的数值范围,用8个字节存储一个浮点数,可以得到15位有效数字。

其实为了高运算精度,程序进行浮点数计算时,自动将float型数据转为double型数据。

说明

有限的存储单元不可能完全精确地存储一个实数。

如float类型变量能存储的范围在:

long double型

怎样确定常量的类型

可以在常量的末尾加上专用字符,强制指定常量的类型。

若表示为float型常量,可以在其后加上F或f;

同理,加上L或l表示此常量为long double/int型的。

flaot a = 3.14159f;
long double a = 1.23L;

运算符和表达式

C 运算符

基本的算术运算符

自增(++)、自减(--)运算符

  • ++,-- 运算符易造成混淆,故需谨慎使用,仅使用最简单的形式即可。

算术表达式和运算符的优先级与结合性

不同类型数据间的混合运算

  • 混合运算时,系统自动将所有变量类型(包括整型,浮点型,字符型)全部转换成double型的,以提高运算精度。

强制类型转换运算符

  • (类型)是最高级别运算符,在算式中最先被运算。