《c语言深度剖析》读书笔记(一)关键字

本文是自己读书的时候一些关于该书的重点及感悟

 

目录

一、关键字

1、auto

2、register

3、static

4、short、int、long、char、float、double

5、sizeof

6、singed、unsigned

7、if、else

8、switch、case

9、do、while、for 

10、goto

11、void

13、const

14、volatile

16、struct

17、union

18、enum

19、typedef


一、关键字

1、auto

编译器在默认的缺省情况下的变量都是auto类型的

2、register

(1)这个关键字请求编译器尽可能的将变量存在cpu内部寄存器,而不是在内存中访问,这个修饰符暗示编译程序相应的变量将被频繁地使用,如果可能的话,应将其保存在CPU的寄存器中

(2)在cpu中register 变量可能不存放在内存中,所以不能用取址运算符“&”来获取 register 变量的地址。但是在mcu中存储结构使用了哈佛结构,指令存储和数据存储是分开存储的,所以stm32的arm内核确能获得寄存器的地址,并通过寄存器的地址来操作外设

3、static

(1)静态全局变量的作用域从定义处开始,到文件末尾结束

(2)static修饰函数时,表明该函数的作用域仅限于本文件,是该文件的私有函数

4、short、int、long、char、float、double

(1)各种数据类型和模具类似,在内存上分割出一块供数据类型使用

(2)全局变量命名采用大驼峰和unix风格的结合 例:Flash_Read()

(3)局部变量命名采用小驼峰和unix风格的结合 例:data_in

(4)程序中不得出现仅靠大小写区分的相似的标识符。

(5)一个函数名禁止被用于其它之处

(6)所有宏定义、枚举常数、只读变量全用大写字母命名,用下划线分割单词

(7)局部变量仅限于 i、j、k 等作为循环变量使用

(8)一般来说习惯上用 n,m,i,j,k 等表示 int 类型的变量;c,ch 等表示字符类型变量;a 等表示数组;p 等表示指针。

(9)局部变量一定要注意初始化,不初始化就使用时其值是不固定的

5、sizeof

(1)sizeof 在计算变量所占空间大小时,括号可以省略,而计算类型(模子)大小时不能省略。

(2)sizeof计算结构体大小时要考虑偏移量的影响

6、singed、unsigned

(1)编译器缺省默认情况下数据为 signed 类型

7、if、else

(1)bool 变量与“零值”进行比较的正确if语句写法 if(bTestFlag); if(!bTestFlag);

(2)float 变量与“零值”进行比较if语句的写法为, if((fTestVal >= -EPSINON) && (fTestVal <= EPSINON)); //EPSINON 为定义好的精度

(3)指针变量与“零值”进行比较if(NULL == p); if(NULL != p);

(4)else始终与同一括号内最近的未匹配的 if 语句结合。

(5)if语句先处理正常情况,再处理异常情况。

8、switch、case

(1)每个 case 语句的结尾绝对不要忘了加 break,否则将导致多个分支重叠(除非

有意使多个分支重叠

(2)switch最后必须使用 default 分支。即使程序真的不需要 default 处理,也应该保留

语句

(3)case 后面只能是整型或字符型的常量或常量表达式

(4)按执行频率排列 case 语句把最常执行的情况放在前面,而把最不常执行的情况放在后面。

(5)不能为了使用 case 语句而刻意制造一个变量

(6)把 default 子句只用于检查真正的默认情况。不能把default用来做其他用

9、do、while、for 

(1)break 关键字很重要,表示终止本层循环

(2)continue 表示终止本次(本轮)循环

(3)在多重循环中,如果有可能,应当将最长的循环放在最内层,最短的循环放

在最外层,以减少 CPU 跨切循环层的次数。

(4)建议 for 语句的循环控制变量的取值采用“半开半闭区间”写法

(5)不能在 for 循环体内修改循环变量,防止循环失控。

(6)把循环嵌套控制在 3 层以内。

10、goto

禁用 goto 语句

11、void

(1)如果函数没有返回值,那么应声明为 void 类型

(2)如果函数无参数,那么应声明其参数为 void类型,在c语言中可以给无参数的函数中传递任何类型的参数

(3)不能对void类型的指针做任何算法处理

(4)如果函数的参数可以是任意类型指针,那么应声明其参数为 void *

(1)return 用来终止一个函数并返回其后面跟着的值

(2)return 语句不可返回指向“栈内存”的“指针”,因为该内存在函数体结束时

被自动销毁

13、const

(1)节省空间,避免不必要的内存分配,同时提高效率,节省空间,避免不必要的内存分配,同时提高效率,const修饰的变量在整个运行空间只存在一个

(2)const 修饰的只读变量具有特定的类型。

(3)修饰符 const 可以用在类型说明符前,也可以用在类型说明符后。

(4)const修饰指针时离哪个近就修饰哪一个

(5)const可以用来修饰函数的输入参数,防止输入参数在运行中被改变

14、volatile

(1)所以说 volatile 可以保证对特殊地址的稳定访问

15、extern

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

16、struct

(1)一般情况下函数的参数不多于四个,如果多余四个的时候,可以用结构体压缩参数个数

(2)编译器为每个结构体类型数据至少预留 1 个 byte的空间。空结构体就占用一个字节的空间

17、union

union 主要用来压缩空间。如果一些数据不可能在同一时间同时被用到,则可以使用 union。

18、enum

(1)如果枚举变量不赋值则会从被赋初值的那个常量开始依次加 1,如果都没有赋值,它们的值从 0 开始依次递增 1。

(2),一般在编译器里,可以调试枚举常量,但是不能调试宏常量。

19、typedef

(1)typedef 的真正意思是给一个已经存在的数据类型(注意:是类型不是变量)取一个别名,而非定义一个新的数据类型。

(2)用 typedef 取的别名不支持这种类型扩展。

发布了59 篇原创文章 · 获赞 8 · 访问量 7478
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览