本篇文章主要写的内容是一些常用数据类型书写过程中的注意事项:
1.避免使用“神秘数值”:神秘数值是指那些在程序中出现的且没有解释过的数值文字量。最好用具名常量来代表这些神秘值
2.预防除零的错误
3.使类型强制转换变得明显
4.避免混合类型的比较:如整数和浮点数比较,如果程序能够运行起来也是歪打正着,所以不要这么使用
5.注意编译器的警告
整数
使用整数时,需要注意一下问题:
1.检查整数除法:在数学领域中的除法运算10*(7/10)=(10*7)/10=7,但是在编程中却不相等10*(7/10)=0,因为7/10转换成整数时为0,所以在整数除法过程中要严格检查一下除法运算的顺序。
2.检查整数溢出:在做整数的加法或乘法的时候,要留心可能的最大整数进行运算的问题。
3.检查中间结果溢出的问题。
浮点数
使用浮点数时主要考虑的是,很多十进制小数不能够精确地用数字计算机中的1和0表示。
1.避免数量级相差巨大的数之间的加减运算,如32为浮点数,1 000 000.00 + 0.1 可能会得到1 000 000.00,因为32位不能提供足够的有效位数包容1 000 000 和0.1之间的数值区间。解决方案就是,从最小数值开始相加。
2.避免等量判断:很多应该想等等额浮点数值并不一定相等。如10个0.1相加来很少会等于1.0。
3.处理舍入误差问题:由于舍入误差导致的错误与数字之间数量级相差太大导致的错误是一样的。
4.检查语言和库函数对特定数据类型的支持
字符和字符处
1.避免使用神秘字符和神秘字符串:神秘字符和神秘字符串的概念与神秘数值相似,就是毫无解释的一些字符和字符串,通常应该使用具名常量来代替这些随意写出来的神秘字符和字符串。
2.避免off-by-one错误(出现在字符处的结尾处’\0‘):由于字符串的下表索引方式几乎与数组相同,因此要避免因为读写操作超过了字符串末尾而导致的off-by-one错误。
3.了解语言和开发环境是如何支持Unicode的
4.在程序生命周期中尽早解决国际化/本地化策略
5.如果知道只需要支持一种文字的语言,请考虑使用ISO8859字符集
6.如果需要支持多种语言,请使用Unicode
7.采用某一致的字符串类型转换策略
针对C语言中的字符串中的一些问题:
C++中的STL库中的string类已经消除了大多数C中字符串相关的传统问题:
1.注意字符串指针和字符数组之间的差异,与字符串指针和字符数组相关的问题来源于C处理字符串的方式:警惕任何包含字符串和等号的表达式;通过命名规则区分变量是字符数组还是字符串指针。
2.把C-style字符串的长度声明为CONSTANT+1的方式
3.用null初始化字符串以避免无结束符的字符串,C语言通过查找空字符来认定字符串有没有结束,因此一定要将其最后一位赋值成空或’\0‘
4.用字符数组取代C中的指针
5.用strncpy()取代strcpy()以避免无结束符的字符串
布尔变量
1.用布尔变量对陈旭加以文档说明
2.用布尔变量来简化复杂的判断
3.如果需要的话,创建自己的布尔类型
枚举类型
1.用枚举类型来提高可读性:每当看到字面形式数字的时候,就该考虑一下是否把它换成枚举类型是不是更加合理。
2.用枚举类型来提高可靠性
3.用枚举类型来简化修改:如果分别用1,2,3来表示不同的含义,当需要修改的时候工作量会很大,因此采用枚举的方法来将特定的数值表示称相应的名称。
4.将枚举类型作为布尔变量的替换方案
5.检查非法数值:用枚举来标记有哪些是非法的
6.定义出枚举的第一项和最后一项,以便用于循环边界
7.把枚举类型的第一个元素留作非法值
8.明确定义项目代码编写标准中第一个和最后一个元素使用规则,并且在使用时保持一致
9.警惕给枚举元素明确赋值而带来的失误
具名常量
具名变量很像变量,一旦赋值以后就不能再修改了,具名常量允许让你拥有一个名字而不是数字来表示固定的量。当需要修改时只需要修改一次即可。
1.在数据声明中使用具名常量
2.统一地使用具名常量:如果需要表示的是同一个实体,在一处使用具名常量,而在另一处使用数字符号是非常危险的。
3.避免使用文字量,即使是“安全”的
数组
1.确认所有的数组下标都没有超出数组的边界
2.考虑用容器来取代数组,或者将数组作为顺序化结构来处理
3.检查数组的边界
4.如果数组是多维的,确认下标的使用顺序是正确的
5.提防下标串话:即多层循环嵌套的时候最容易发生里面的循环引错了其他的数组或者下标的情况。
创建自己的类型(类型别名)
这样的好处与具名常量的好处是一样的,如吧x、y、z坐标系中的坐标值转化为纬度、经度和海拔高度,此时不知道是使用单精度还是双精度的时候,可以利用typedef来定义一个名称如 typedef float coordinate;作为一个浮点数的代表,当需要修改为双精度的时候就可以修改一处就可以了。
创建自定义数据类型的指导原则
1.给所创建的类型取功能导向的名字:避免使用那些代表了类型底层计算机数据类的类型名。
2.避免使用预定义类型:如果类型有可能变化,就应避免在除typedef或类型定义以外的任何位置使用预定义的类型。
3.不要重定义一个预定义的类型
4.定义替代类型以便于移植
5.考虑创建一个类而不是使用typedef:简单的typedef对隐藏变量的底层类型信息室大有帮助的。然而,可能会需要定义类所能获得的哪些二外的灵活度和控制力。