code complete part2

基本数据类型:

1. 程序主体中仅能出现的数字就是0和1,除此之外,所有的数字都要用宏定义或者const类型,用清晰的变量名描述用途

2. 预防除零错误, assert(denominator!=0)或者其他

3. 显式进行类型转换

4.避免不同类型间比较

5.注意编译器警告

对于整数,需要注意:整数除法(去尾法),检查整数溢出,检查中间结果溢出

对于浮点数,需要注意:避免==的判断,需要加一个阈值,例如

for(i=0;i<10;i++)

a + = 0.1;

if(a==1.0)

 因为最后的结果一定不会刚好等于1, 0.1在内存中二进制表示为0.000110011......

对于字符串,避免off-by-one错误,以及unicode,还有区分字符串和字符数组,malloc和calloc(包含了分配和初始化),用strcpy_s以及strncpy,不用strcpy

对于bool,用布尔变量来简化if的判断,一般写if(A&&B||C)可以直接写作 bool bskip = A&&B||C, if(bskip)....

对于枚举类型,把第一个留给非法值,因为大多数没有赋值的时候,就是0,这样可以及早的检测出问题

对于数组,如果操作比较复杂,不要用i,j来表示下标,因为比较容易弄混。。。

建立自己的类型,typedef float coordinate,这样可以起到封装的效果,并且一看就知道这个变量是用于存储坐标的;不过要记住不要重定义一个变量的类型

对于指针,可以用dog tag来监视这一段内存有没有被写坏。分配的时候多分配一些,在内存空间的前一段作为dog tag

组织直线型代码

如果有些函数要在另一些之前call到,请在函数名中清楚的表明这一点,init....之类的

使用条件语句

if...else 先判断那些正常的路径,再在else中处理那些不常见的代码

如果写了if,那么也要写else,要考虑如果出现了else怎么办

利用bool变量简化判断

对于case语句,把最常执行的放在顶端,用default来检查错误,打印错误信息

使用循环

任何时候都要在循环体加{},方便代码改动

循环的一些++操作,在循环体的最前面或者最后面进行

循环计数器应该是整形的

循环体不超过50行

嵌套小于3层

长循环挪到子函数中

原文地址:https://www.cnblogs.com/sunny-li/p/5427463.html