11.1 常数
避免" 奇异数"(magic numbers)。“奇异数”指的是出现在程序中间的不加解释的常数。
在需要时可以使用常数“0”或“1”
采取预防被"0" 除的措施
明显进行类型转换
避免混合类型比较
注意编译程序的警告
优秀的程序员总是力争消除所有的编译程序
警告信息。让编译程序去查错毕竟比自己干容易得多。
11.2 整型数
检查整型相除
检查整型是否溢出
检查中间结果是否溢出
11.3 浮点数
不要在数量级相差太大的数之间进行加减运算
避免相等比较
防止舍入误差
11.4 字符和字符串
避免“奇异字符和字符串”
警惕边界错误
11.4.1 C语言字符串
要清楚字符串指针和字符数组之间的区别
要注意任何含有字符串且又带有引号的表达式
使用命名约定来表示变量究竟是字符数组还是字符串指针
将字符串的长度说明为CONSTANT+1
把字符串初始化为“0”以避免无限长字符串
在C中用字符数组来代替指针
用strncpy() 代替strcpy()以避免无限长字将串
像strcpy() 和strcmp()之类的子程序是很危险的 ,因为只有当遇到零结束符时它们才会停止。而strncpy()和 strncmp()相对来说,则要安全得多 ,因为它们把某一参数当作最大长度,因此即使某些字符率是无限长的,你的调用函数也不会持续不断地永远进行下去。
11.5 逻辑变量
使用逻辑变量来说明程序
使用逻辑变量来简化复杂的判断
如果必要的话,建立自己的逻辑类型
11.6 枚举类型
使用枚举类型来提高可读性
使用枚举类型来提高可靠性
使用枚举类型来改善易修改性
用枚举类型来代替逻辑变量
检查无效值
把枚举类型的第一个入口保留为无效的
11.6.1 如果所用的语言不支持枚举类型
许多编译程序都把枚举类型中第一个元素的值赋为零。把被赋为 0值的那个元素说明为无效,可以帮助找出不恰当初始化的变量,因为当它们失效时更容易为0。
11.7 命名常量
在数据说明中使用命名常量
避免常数值
使用全局变量来模拟命名常量
一致地使用命名常量
11.8 数 组
确保所有的数组下标都没有越界
把数组当作顺序性结构 许多计算机科学家建议决不要随机地对数组进行存取。
检查数组边界
对于多维数组,要保证其下标的顺序是正确的
警惕下标的错误交叉
使数组的长度留有一定裕度
在 C 中,使用 ARRAY_LENGTH( )宏来处理数组
11.9 指 针
11.9.1 理解指针
每个指针包括两部分: 内存存储单元及对这个存储单元中内容的解释。
内存中的存储单元
内存中的存储单元就是地址,通常是用十六进制数来表示的。
怎样解释存储单元中的内容
解释存储单元中内容的基础是指针的基本类型。如果指针指向一个整数,它的真实含义 是编译程序把由指针提供的存储单元解释为一个整数。当然,可能会出现整数指针、字符串 指针和浮点数指针同时指向同一个存储单元的情况,而此时只有一个指针正确地解释了该 单元中的内容。
11.9.2 关于使用指针的几点建议
在使用指针之前对它进行检查
把指针操作独立在子程序中
在使用变量之前应先检查一下这一变量
使用标记字段来查找错误内存
使用显示冗余技术
释放指针后,把它设为 NULL 或 NIL。
使用额外的指针变量以增加清晰性。不管怎样,都不要吝于供给指针变量。
简化复杂的指针表达式
编写跟踪指针存储单元的子程序
按正确顺序释放链表中的指针
编写输出指针地址的子程序
在内存中划分出一段空间作为“降落伞”
使用非指针技术
11.9.3 C 中的指针
应使用显式指针类型而不是缺省类型
避免强制类型转换。
遵守参数传递的星号规则。
使用 sizeof()来确定内存存储单元中变量的规模。
使用 sizeof()不会影响性能,因为它的计算是在编译过程中进行的