看完代码大全第12章『基本数据类型』,我想根据我们目前最容易遇到的以及对于我们目前最需要重视的方面,提炼出一些书中的精华。在这经典之上再进行浓缩一下。
直接步入正题吧
数值概论
1:坚持一个原则:避免使用神秘数值(magic number)
神秘数值:程序中出现的、没有经过解释的数值文字量。如100、2345。
解决方法:用具名常量代替神秘数值
一条很好的经验法则:程序主体中仅能出现的文字量就是0和1。其他任何文字量都应该换成更具描述性的表示。
2:预防除零错误
3:使类型转换变得明显
y = x + (float) i
4:避免混合类型的比较
i是整数 x是浮点数
if (i = x) then ...
5:注意编译器的警告
整数
- 检查整数除法
- 检查整数溢出
- 检查中间结果溢出
浮点数
- 避免数量级差异巨大的数之间的加减运算
- 避免等量判断【一种有效的替代方法就是:先确定可接受的精确范围,然后用布尔函数判断数值是否足够接近】
- 处理舍入误差
- 检查语言和我函数库对特定数据类型的支持
字符和字符串
- 避免使用神秘字符和神秘字符串
- 避免off-by-one
- 使用Unicode编码
C语言中的字符串:
- 注意字符串和字符数组之间的差异
- 把C-style 字符串的长度声明CONSTANT + 1【用具名常量声明所有字符串,把字符串的长度声明CONSTANT +1,然后在余下的代码里用CONSTANT来指定字符串的长度】
用null初始化字符串以避免无结束的字符
char EventName [MAX_NAME_LENGTH +1] = {0};
用 strncpy() 取代 strcpy 以避免无结束的字符串
- 动态分配字符串时,用calloc()而不是malloc()来把它初始化,callo()会负责分配内存,并把它初始化为0,而malloc()只分配内存,并不执行初始化。
- 用字符数组取代C中的指针
布尔变量
- 用布尔变量对程序加以文档说明
- 用布尔变量来简化复杂的判断
枚举类型
1:用枚举类型来提高可读性
if chosenColor = 1
if chosenColor = Color_Red
第二个式子比第一个更具可读性
2:用枚举类型来简化修改
3:如果你的语言里没有枚举类型,可以用类来模拟它【java】
具名常量
- 统一的使用具名常量
- 如果不支持具名常量,则用适当作用域的变量或类来模拟具名常量
- 具名常量允许你用一个名字而不是数字来表示固定的量
- 具名常量是一种将程序参数化的方法,当你需要对其修改时,只需要修改一处就可以了
- 在数据声明中使用具名常量
数组
数组最显著的特点就是可以随机访问
1:确认所有的数组下标都没有超出数组的边界
2:考虑用容器去取代数组,或者将数组作为顺序化结构来处理
建议使用集合、栈、和队列等按顺序存取元素的数据结构来取代数组
3:检查数组的边界点
4:在C中结合ARRAY_LENGTH()宏来使用数组
创建你自己的数据类型
有什么好处:
- 易于修改
- 增加可靠性
- 避免过多的信息分发
- 弥补语言的不足
创建原则:
- 避免使用预定义类型
- 不要重定义一个预定义的类型【语言有了一个预定义的类型Integer,你自己就不要创建名为Integer的自定义类型了】
- 定义替代类型以便于移植
- 最好的原则:创建一个类 而不是使用typedef【类具有更高的灵活性和控制力】