核对表:基本数据类型
数值概论
- 代码中避免使用神秘数值
- 代码考虑了除零错误了吗?
- 类型转换很明显吗?
- 如果在一条语句中存在两个不同类型的变量,那么这条语句会想你期望的那样求值吗?
- 代码避免了混合类型比较吗?
- 程序编译时没有警告信息吗?
整数
- 使用整数除法的表达式能按预期的那样工作吗?
- 整数表达式避免整数溢出问题吗?
浮点数
- 代码避免了对数量级相差巨大的数字做加减运算吗?
- 代码系统地阻止了舍入错误的发生吗?
- 代码避免对对浮点数做灯亮比较吗?
字符和字符串
- 代码避免使用神秘字符串和神秘字符了吗?
- 使用字符串时避免了off-by-one错误了吗?
- C代码吧字符串指针和字符数组区别对待了吗?
- C代码遵循了把字符串声明为CONTANT+1长度了吗?
- C代码在适当的时候用字符数组来代替指针了吗?
- C代码吧字符串初始化为NULL来避免无终端的字符串了吗?
- C代码用strncpy()代替strcpy()吗?strncat()和strncmp()呢?
布尔变量
- 程序用额外的布尔变量来说明条件判断了吗?
- 程序用额外的布尔变量来简化条件判断了吗?
枚举类型
- 程序用枚举类型而非具名常量来提高可读性、可靠性、和可修改性了吗?
- 当变量的用法不能仅用true和false表示的时候,程序用枚举类型取代布尔变量吗?
- 针对枚举类型的测试检测了非法数值吗?
- 把枚举类型的第一项条目保留为“非法“了吗?
具名常量
- 程序用具名常量而不是神秘数值来声明数据和表示循环界限了吗?
- 具名常量的使用一致吗?——没有在有些位置使用具名常量又在其它位置使用文字量?
数组
- 所有的数组下标都没有超出数组边界吗?
- 数组引用没有出现off-by-one错误吗?
- 所有多维数组的下标的顺序都正确吗?
- 在嵌套循环里,把正确的变量用于数组下标来避免循环下标串话了吗?
创建类型
- 程序对每一种可能变化的数据分别采用不同的类型吗?
- 类型名是以该类型所表示的显示世界实体为导向,而不是以编程语言类型为导向吗?
- 类型名的描述性足以强,可以帮助解释数据声明吗?
- 你避免重新定义预定义类型吗?
- 与简单的重定义一个类型相比,你考虑过创建一个新类吗?
要点
- 使用特定的数据类型就意味着要记住适用于各个类型的很多独立的原则。用本章的核对表来确认你已经对常见问题做了考虑。
- 如果你的语言支持,创建自定义类型会使得你的程序更容易修改,并更具有自描述性
- 当你用typedef或者其等价方式创建了一个简单类型的时候,考虑是否更应该创建一个新的类