放假就摆烂了,这莫多天看了一本书,对我的影响还是挺大的。一些通用的规则还是要得到应用才好,使他人看的明白,为了日后自己检查运或添加新功能提供方便(我之前写的代码,只有三天以内的我能看懂。流汗ing)。在此书中看到的一些知识,将查漏补缺在之前的文章中。
此文仅记录一些规则,以便日后翻找查阅,规范自己代码。
如果想准确理解其意义,还需支持正版,认真阅读,相信能收获颇丰。
变量命名规则
- 直观,可拼读,可望文知意——英文单词or+词语组合,用词应当精确。
- 对于要使用较长单词时,可将其元音去除,使其简洁。
- 若需使用多词,每词第一个字母大写,其余小写,简洁便于阅读。
- 避免使用数字编码,查找意义费时费力,如同定时炸弹。
- 多个文件共同使用的全局变量或函数要加范围限定(建议模块名(缩写)作为范围限定)。注释例:范围限定(DUQI,JIA)。
标识符的命名规则:
- 标识符名分为两部分:规范标识符前缀(后缀)+含义标识。非全局变量可以不用范围限定符前缀。
- 作用域前缀命名规则
No. 标识符类型 作用域前缀 1 Global Varizble g 2 File Static Variable(native) n 3 Function Static Variable f 4 Auto Variable a 5 Global Function g 6 Static Function n - 数据类型前缀命名规则
含义标识命名规则,变量命名使用名词性词语,函数命名使用动词性词组。
No. | 变量名 | 目标词 | 动词(的过去分词) | 状语 | 目的地 | 含义 |
---|---|---|---|---|---|---|
1 | DataGotFromSD | Data | Got | From | SD | 从SD中取得的数据 |
2 | DataDeletedFromSD | Data | Deleted | From | SD | 从SD中删除的数据 |
- 变量含义标识符构成:目标词+动词(的过去分词)+【状语】+【目的地】;
No. | 变量名 | 动词(一般现在) | 目标词 | 状语 | 目的地 | 含义 |
---|---|---|---|---|---|---|
1 | GetDataFromSD | Got | Data | From | SD | 从SD中取得的数据 |
2 | DeleteDataFromSD | Delete | Data | From | SD | 从SD中删除的数据 |
- 函数含义标识符构成:动词(一般现在)+目标词+【状语】+【目的地】;
- 程序中不得出现仅依靠大小写区分的相似的标识符。(数字1和小写l,数字0和小写o等)
-
函数名禁止用于其他之处。
-
所有宏定义、枚举常数、只读变量全部用大写字母命名,用下划线分割单词。
-
局部变量可采用通用的命名方式,仅限n,i,j等作为循环变量使用。习惯的命名方式如下:
int n,m,i,j,k char c,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 的区别