C语言深度剖析阅读笔记

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

  • 作用
    1. 修饰变量
      • 静态全局变量:作用域为变量被定义的文件中,即从定义之处开始,到文件结尾处结束,在定义之处前面的那些代码行也不能使用,想要使用就得在前面再加 extern。其他文件中即使用 extern 声明也没法使用。
      • 静态局部变量:函数体内定义的,只能在函数内使用。由于被 static 修饰的变量总是存在内存的静态区,所以即使这个函数运行结束,这个静态变量的值还是不会被销毁,函数下次使用时仍然能用到这个值。
    2. 修饰函数:函数前加 static 使得函数成为静态函数,指函数的作用域仅局限于本文件(又称内部函数)。
      • 优点:不同的人编写不同的函数时,不用担心自定义的函数,是否会与其它文件中的函数同名。

总结:

  1. 为了表示退出一个 块后仍然存在的局部变量。
  2. 用来表示不能被其它文件访问的全局变量和函数。

数据类型=模具

不同的数据类型就像是不同大小的类型分配模具。

  • 在 32 位的系统上:
    • short 咔出来的内存大小是 2 个 byte;
    • int 咔出来的 内存大小是4个byte;
    • long咔出来的内存大小是4个byte;
    • float咔出来的内存大小是4 个 byte;
    • double 咔出来的内存大小是 8 个 byte;
    • char 咔出来的内存大小是 1 个 byte。

变量的命名规则

  1. 当变量名由多个词组成时,每个词的第一个字母大写,其余全部小写。
  2. 变量名的长度应尽量短,较长的单词可通过去掉 “元音” 形成缩写。
  3. 避免名字中出现数字编号,如 Value1Value2 等。
  4. 所有宏定义、枚举常数、只读变量全用大写字母命名,用下划线分割单词。
  5. 局部变量中可采用通用的命名方式,仅限于 nij 等作 为循环变量使用。

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 组合。

  • 规则

    1. 每个 case 语句的结尾绝对不要忘了加 break,否则将导致多个分支重叠。
    2. 最后必须使用 default 分支。即使程序真的不需要 default 处理,也应该保留语句。
    3. 按字母或数字顺序排列各条 case 语句。
    4. 把正常情况放在前面,而把异常情况放在后面。
    5. 按执行频率排列 case 语句
    6. 简化每种情况对应的操作。
  • case关键字后的值:case 后面只能是整型或字符型的常量或常量表达式(字符类型与整型数据存储方式相同)。

do、while、for 关键字

  • 规则
    1. 应当将最长的循环放在最内层,最短的循环放 在最外层,以减少 CPU 跨切循环层的次数。

const = readonly

编译器通常不为普通 const 只读变量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的值,没有了存储与读内存的操作,使得它的效率也很高。

extern关键字

  • extern 关键字:extern 可以置于变量或者函数前,以表示变量或者函数的定义在别的文件中,下面的代码用到的这些变量或函数是外来的,不是本文件定义的,提示编译器遇到此变量和函数时在其他模块中寻找其定义。

struct关键字

函数的参数尽量不多于 4 个,可以用结构体压缩参数个数。

  • struct大小:结构体所占的内存大小是其成员所占内存之和,空结构体的大小为1

union 关键字

在 C++里,union 的成员默认属性页为 public。

  • union关键字:union 中所有的数据成员共用一个空间,同一时间只能储存其中一个数据成员,所有的数据成员具有相同的起始地址。union的大小为最长数据成员的大小。
  • union使用场景:union 主要用来压缩空间。如果一些数据 不可能在同一时间同时被用到,则可以使用 union。

第二章

运算符优先级

  1. []().->
  2. -(类型)++--*&!~sizeof
  3. /*%
  4. +-
  5. <<>>
  6. >>=<<=
  7. ==!=
  8. &
  9. ^
  10. |
  11. &&
  12. ||
  13. ?:
  14. =/=*=%=+=-=<<=>>=&=^=|=
  15. ,

第三章 预处理

预处理指令

image-20230713182613161
posted on 2024-01-22 10:49  WilliamMoa  阅读(11)  评论(0)    收藏  举报