C语言深度剖析阅读笔记
目录
第一章 关键字
C语言的32个关键字
| 关键字 | 意义 |
|---|---|
| auto | 声明自动变量,缺省时编译器一般默认为 auto |
| int | 声明整型变量 |
| double | 声明双精度变量 |
| long | 声明长整型变量 |
| char | 声明字符型变量 |
| float | 声明浮点型变量 |
| short | 声明短整型变量 |
| signed | 声明有符号类型变量 |
| unsigned | 声明无符号类型变量 |
| struct | 声明结构体变量 |
| union | 声明联合数据类型 |
| enum | 声明枚举类型 |
| static | 声明静态变量 |
| switch | 用于开关语句 |
| case | 开关语句分支 |
| default | 开关语句中的“其他”分支 |
| break | 跳出当前循环 |
| register | 声明寄存器变量 |
| const | 声明只读变量 |
| volatile | 说明变量在程序执行中可被隐含地改变 |
| typedef | 用以给数据类型取别名(当然还有其他作用) |
| extern | 声明变量是在其他文件中声明(也可以看做是引用变量) |
| return | 子程序返回语句(可以带参数,也可不带参数) |
| void | 声明函数无返回值或无参数,声明空类型指针 |
| continue | 结束当前循环,开始下一轮循环 |
| do | 循环语句的循环体 |
| while | 循环语句的循环条件 |
| if | 条件语句 |
| else | 条件语句否定分支(与 if 连用) |
| for | 一种循环语句(可意会不可言传) |
| goto | 无条件跳转语句 |
| sizeof | 计算对象所占内存空间大小 |
定义与声明
-
定义:定义就是编译器创建一个对象,为这个对象分配一块内存,并给它取上一个名字,即变量名或对象名。
注意,变量名或对象名一旦和这块内存匹配起来,它们就同生共死,终生不离不弃,并且这块内存的位置也不能被改变。
一个变量或对象在一定的区域内(比如函数内,全局等)只能被定义一次,如果定义多次,编译器会提示你重复定义同一个变量或对象。
-
声明:告诉编译器,该名字已经使用了,其他地方不能用该名字来作为变量名或对象名。下面代码若用到该名字,需要在代码其他地方找到变量或对象的定义。
-
区别:定义创建了对象并为这个对象分配了内存,声明没有分配内存。
register---最快的关键字
- register关键字:这个关键字请求编译器,尽可能的将变量存在 CPU内部寄存器中,而不是通过内存寻址访问以提高效率。注意是尽可能,不是绝对。这是由于一个 CPU 的寄存器只有几个或几十个,如果定义了很多 register 变量,由于资源有限,不可能一次性全部把这些变量放入寄存器。
- 使用注意事项:
- register 变量必须是能被 CPU 寄存器所接受的类型,即register 变量必须是一个单个的值,并且其长度应小于或等于整型的长度。
- register 变量不存放在内存中,所以不能用取址运算符
“&”来获取 register 变量的地址。
寄存器---过渡
相比于CPU从内存里去寻找某个地址上的数据,CPU从寄存器获取数据的速度更快。
- 寄存器的过渡作用:数据从内存里拿出来先放到寄存器,然后 CPU 再从寄存器里读取数据来处理,处理 完后同样把数据通过寄存器存放到内存里,CPU 不直接和内存打交道。
static
- 作用:
- 修饰变量:
- 静态全局变量:作用域为变量被定义的文件中,即从定义之处开始,到文件结尾处结束,在定义之处前面的那些代码行也不能使用,想要使用就得在前面再加 extern。其他文件中即使用 extern 声明也没法使用。
- 静态局部变量:函数体内定义的,只能在函数内使用。由于被 static 修饰的变量总是存在内存的静态区,所以即使这个函数运行结束,这个静态变量的值还是不会被销毁,函数下次使用时仍然能用到这个值。
- 修饰函数:函数前加 static 使得函数成为静态函数,指函数的作用域仅局限于本文件(又称内部函数)。
- 优点:不同的人编写不同的函数时,不用担心自定义的函数,是否会与其它文件中的函数同名。
- 修饰变量:
总结:
- 为了表示退出一个 块后仍然存在的局部变量。
- 用来表示不能被其它文件访问的全局变量和函数。
数据类型=模具
不同的数据类型就像是不同大小的类型分配模具。
- 在 32 位的系统上:
- short 咔出来的内存大小是 2 个 byte;
- int 咔出来的 内存大小是4个byte;
- long咔出来的内存大小是4个byte;
- float咔出来的内存大小是4 个 byte;
- double 咔出来的内存大小是 8 个 byte;
- char 咔出来的内存大小是 1 个 byte。
变量的命名规则
- 当变量名由多个词组成时,每个词的第一个字母大写,其余全部小写。
- 变量名的长度应尽量短,较长的单词可通过去掉 “元音” 形成缩写。
- 避免名字中出现数字编号,如
Value1,Value2等。 - 所有宏定义、枚举常数、只读变量全用大写字母命名,用下划线分割单词。
- 局部变量中可采用通用的命名方式,仅限于
n、i、j等作 为循环变量使用。
signed、unsigned
把基本数据类型的最高位腾出来,用来存符号,同时约定如下:
1. 最高位如果是 1,表明这个数是负数
2. 最高位如果是 0,表明这个数是正数
- 32 位的 signed int 类型整数其值表示范围为:
-2^31 ~ 2^31 - 1。 - 8 位的 char 类型数其值表示的范围为:
-2^7 ~ 2^7 - 1。 - 32 位的 unsigned int 类型整数其值表示范围为:
0 ~ 2^32 - 1。
if语句
规则:先处理正常情况,再处理异常情况。
switch、case
if、else 一般表示两个分支或是嵌套表示少量的分支,如果分支较多,则使用 switch、case 组合。
-
规则:
- 每个 case 语句的结尾绝对不要忘了加 break,否则将导致多个分支重叠。
- 最后必须使用 default 分支。即使程序真的不需要 default 处理,也应该保留语句。
- 按字母或数字顺序排列各条 case 语句。
- 把正常情况放在前面,而把异常情况放在后面。
- 按执行频率排列 case 语句
- 简化每种情况对应的操作。
-
case关键字后的值:case 后面只能是整型或字符型的常量或常量表达式(字符类型与整型数据存储方式相同)。
do、while、for 关键字
- 规则:
- 应当将最长的循环放在最内层,最短的循环放 在最外层,以减少 CPU 跨切循环层的次数。
const = readonly
编译器通常不为普通 const 只读变量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的值,没有了存储与读内存的操作,使得它的效率也很高。
extern关键字
- extern 关键字:extern 可以置于变量或者函数前,以表示变量或者函数的定义在别的文件中,下面的代码用到的这些变量或函数是外来的,不是本文件定义的,提示编译器遇到此变量和函数时在其他模块中寻找其定义。
struct关键字
函数的参数尽量不多于 4 个,可以用结构体压缩参数个数。
- struct大小:结构体所占的内存大小是其成员所占内存之和,空结构体的大小为1
union 关键字
在 C++里,union 的成员默认属性页为 public。
- union关键字:union 中所有的数据成员共用一个空间,同一时间只能储存其中一个数据成员,所有的数据成员具有相同的起始地址。union的大小为最长数据成员的大小。
- union使用场景:union 主要用来压缩空间。如果一些数据 不可能在同一时间同时被用到,则可以使用 union。
第二章
运算符优先级
[]、()、.、->。-、(类型)、++、--、*、&、!、~、sizeof。/、*、%。+、-。<<、>>。>、>=、<、<=。==、!=。&。^。|。&&。||。?:。=、/=、*=、%=、+=、-=、<<=、>>=、&=、^=、|=。,。
第三章 预处理
预处理指令
浙公网安备 33010602011771号