《C语言深度解刨》阅读笔记 I

放假就摆烂了,这莫多天看了一本书,对我的影响还是挺大的。一些通用的规则还是要得到应用才好,使他人看的明白,为了日后自己检查运或添加新功能提供方便(我之前写的代码,只有三天以内的我能看懂。流汗ing)。在此书中看到的一些知识,将查漏补缺在之前的文章中。

此文仅记录一些规则,以便日后翻找查阅,规范自己代码。

如果想准确理解其意义,还需支持正版,认真阅读,相信能收获颇丰。

变量命名规则

  • 直观,可拼读,可望文知意——英文单词or+词语组合,用词应当精确。
  • 对于要使用较长单词时,可将其元音去除,使其简洁。
  • 若需使用多词,每词第一个字母大写,其余小写,简洁便于阅读。
  • 避免使用数字编码,查找意义费时费力,如同定时炸弹。
  • 多个文件共同使用的全局变量或函数要加范围限定(建议模块名(缩写)作为范围限定)。注释例:范围限定(DUQI,JIA)。
标识符的命名规则:
  • 标识符名分为两部分:规范标识符前缀(后缀)+含义标识。非全局变量可以不用范围限定符前缀。
  • 作用域前缀命名规则
    No.标识符类型作用域前缀
    1Global Varizbleg
    2File Static Variable(native)n
    3Function Static Variablef
    4Auto Variablea
    5Global Functiong
    6Static Functionn
  • 数据类型前缀命名规则

含义标识命名规则,变量命名使用名词性词语,函数命名使用动词性词组。

No.变量名目标词动词(的过去分词)状语目的地含义
1DataGotFromSDDataGotFromSD从SD中取得的数据
2DataDeletedFromSDDataDeletedFromSD从SD中删除的数据
  • 变量含义标识符构成:目标词+动词(的过去分词)+【状语】+【目的地】;
No.变量名动词(一般现在)目标词状语目的地含义
1GetDataFromSDGotDataFromSD从SD中取得的数据
2DeleteDataFromSDDeleteDataFromSD从SD中删除的数据
  • 函数含义标识符构成:动词(一般现在)+目标词+【状语】+【目的地】;
  • 程序中不得出现仅依靠大小写区分的相似的标识符。(数字1和小写l,数字0和小写o等)
  • 函数名禁止用于其他之处。

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

  • 局部变量可采用通用的命名方式,仅限n,i,j等作为循环变量使用。习惯的命名方式如下:

    intn,m,i,j,k
    charc,ch
    数组a,arr
    指针p

    (除了循环变量外,尽量不要使用这些,还是应该用有意义的命名方式。)

  • 结构体被定义时要有明确的结构体名。

  • 定义变量的同时千万别忘记初始化。定义变量时编译器并不一定清空了

    这块内存,它的值可能是无效的数据。

  • 不同类型数据之间的运算要注意精度扩展问题,一般低精度数据将向高精度

    数据扩展。

  • 禁用八进制常数和八进制转义字符。计算机中任何以0开头的数字都会被认为是八进制的数。所以当写固定长度的数时,会存在一些风险。在转义字符中后面跟八进制数,用于表示ASCII码等于该值的字符,使用时也可能出错。

  • 单纯的char类型只应用于字符值的存储和使用。
    无符号和有符号char型变量只用于数值的存储和使用。

  • 所有无符号型常量都应带有字母‘U’后缀。

  • 使用浮点数应遵循已定义好的浮点数标准(ANSI/IEEE标准)。

  • 程序中的分界符‘{’和‘}’对齐风格如下:
    注意:下表中代码的缩进一般为4 个字符,但不要使用Tab 键,因为不同的编辑器Tab 键定义
    的空格数量不一样,别的编辑器打开Tab 键缩进的代码可能会一片混乱。

  • if语句先处理正常情况,再处理异常情况。正常情况在前可增加代码性能和可读性。不常发生的异常情况不会遮掩正常的执行路径。

  • 确保if和else字句没有弄反。

  • 赋值运算符不能使用在产生布尔值的表达式上。

  • 所有if—else if结构应该由else子句结束。此为保护性编程,与default子句是一致的。

  • 在switch语句中,每个case语句的结尾据对不要忘记加break,否则将导致多各分支重叠(除非有意使用)。

    default;
        break;
  •  在switch case 组合中,禁止使用return语句。

  • switch表达式不应是有效的布尔值。case后面只能是整型或字符型的常量或常量表达式。

  • 按字母或数字顺序排列各条case语句。

  • 按执行频率排列case语句。常用的放前面。

  • 简化每一种情况对应的操作。代码尽可能精炼。

  • 不要为了使用case语句而刻意制造一个变量。刻意创造容易使人迷糊。

  • 将default语句只用于检查真正的默认情况。不要为了偷懒将最后一个case归给default子句,否则容易使default子句丧失处理错误的能力。

  • 在多重循环中,如果有可能,应当将最长的循环放在最内层,最短的循环放在最外层,以减少CPU跨切循环层的次数。

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

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

  • 循环要尽可能短,要代码清晰,一目了然。

  • 要把循环嵌套控制在3层以内。

  • for语句的控制表达式不能包含任何浮点类型的对象。

  • 禁用goto语句。使用易有隐患。

  • void的作用:①对函数返回的限定;②对函数参数的限定;
    (void*,空指针类型,可被任何类型的指针赋值,无需强转,但不能不经过强转赋值其他类型的指针,无使用必要。)

  • 如果函数没有返回值,应将其声明为void类型。

  • 如果函数无参数,那么应声明其参数为void。

  • 千万小心又小心地使用void指针类型。

  • 如果函数的参数可以是任意类型指针,应声明其参数为void*。

  • void不能代表一个真实的变量。因为定义变量时必须分配内存空间。

  • return(Val);//括号可以省略;但一般不省略,尤其是返回一个表达式的值时。

    return语句不可返回指向“栈内存”的“指针”,因为该内存在函数体结束时被自动销毁。

  • const是constant 的缩写,是恒定不变的意思。准确来讲应是只读变量(readonly)。
    const修饰的只读变量必须在定义的同时初始化。const修饰的函数的返回值不可改变。

  • volatile异变的,随时可能发生改变,用它修饰的变量表示可以被某些编译器
    未知的因素更改,比如操作系统、硬件或者其它线程等。遇到这个关键字声明的变量,编
    译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地址的稳定访问。

  • struct空结构体的大小为1字节(习惯认为,C中无规定)。

  • 柔性数组
    C99 中,结构中的最后一个元素允许是未知大小的数组,这就叫做柔性数组成员,但结
    构中的柔性数组成员前面必须至少一个其他成员。柔性数组成员允许结构中包含一个大小可
    变的数组。sizeof 返回的这种结构大小不包括柔性数组的内存。包含柔性数组成员的结构用
    malloc ()函数进行内存的动态分配,并且分配的内存应该大于结构的大小,以适应柔性数组
    的预期大小。

  • 在C++里struct 关键字与class 关键字一般可以通用,只有一个很小的区别。struct 的成
    员默认情况下属性是public 的,而class 成员却是private 的。

  • union 关键字的用法与struct 的用法非常类似。
    union 维护足够的空间来置放多个数据成员中的“一种”,而不是为每一个数据成员配置
    空间,在union 中所有的数据成员共用一个空间,同一时间只能储存其中一个数据成员,所
    有的数据成员具有相同的起始地址。
    在C++里,union 的成员默认属性页为public。union 主要用来压缩空间。如果一些数据不可能在同一时间同时被用到,则可以使用union。

  • 大小端模式对union 类型数据的影响
    这里需要考虑存储模式:大端模式和小端模式。
    大端模式(Big_endian):字数据的高字节存储在低地址中,而字数据的低字节则存放
    在高地址中。
    小端模式(Little_endian):字数据的高字节存储在高地址中,而字数据的低字节则存放
    在低地址中。
    union 型数据所占的空间等于其最大的成员所占的空间。对union 型的成员的存取都是
    相对于该联合体基地址的偏移量为0 处开始,也就是联合体的访问不论对哪个变量的存取都
    是从union 的首地址位置开始。

  • 如何用程序确认当前系统的存储模式?

  • C 语言的位域(bit-field)是一种特殊的结构体成员,允许我们按位对成员进行定义,指定其占用的位数。
    如果程序的结构中包含多个开关的变量,即变量值为 TRUE/FALSE。

  • enum枚举数据类型

  • typedef 的真正意思是给一个已经存在的数据类型(注意:是类型不是变量)取一个别
    名,而非定义一个新的数据类型。
    用typedef重命名基本的数据类型,以替代原始的数据类型,表达出想要表达的意思。

  • typedef 与#define 的区别

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

七十二旹

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值