规则1:避免使用神秘字符和神秘字符串;
此规则和上一条“代码中避免使用神秘数值”大同小异。
神秘字符是指程序中随处可见的字面形式表示的字符(比如:’A’);
神秘字符串是指字面形式表示的字符串(比如:”str”);
解决办法:具名常量或者全局变量
规则2:使用字符串时避免off-by-one(偏差一)错误;
Off-by-one错误参考别人的博客:
http://blog.csdn.net/gzliu_hit/article/details/7541022
规则3:区分字符指针和字符数组;
从以下两个方面来看字符指针和字符数组的差异:
l 警惕任何包含字符串和等号的表达式,等号几乎意味着某种指针错误。在C语言中,字符串的操作基本都是通过strcmp( ),strcpy(),strlen(),strcat()及其他相关子程序来完成的。
l 通过命名规则区分变量是字符数组还是字符串指针。字符数组加前缀ach,字符指针加前缀ps。
规则4:遵循把字符串长度申明为STRLEN + 1的规则;
程序中使用统一的规则,便于维护和理解。
规则5:适当时候,用字符数组代替字符指针;
如果内存不受限,那么就把所有的字符串变量都声明为字符数组。这样有助于避免指针错误,即使出错,编译器也会给更多警告。
规则6:字符串初始化为NULL;
字符串的结尾字符必须是 ’\0’,字符串初始化为NULL,可以避免无结束符的字符串。两种实现方法:
l 声明字符数组的时候把它初始化为0;
l 在动态分配字符串的时候,使用calloc( )而不是malloc( )来把它初始化为0。calloc( )负责分配内存,并把它初始化为0;malloc( )只分配内存,并不执行初始化,小心使用malloc( )!
规则7:strncpy( )代替strcpy( );strncat( )代替strcat( );strncmp( )代替 strcmp( );
strncpy(),strncat( ),strncmp( )等函数,会接受一个表示最大长度的参数,因此一旦处理到此参数长度位置,即使字符串还没有结束,函数调用也会及时返回。
布尔变量
规则1:用额外的布尔变量说明条件判断;
将条件判断表达式用一个布尔变量来表示,这样程序看起来会更清晰。
规则2:用额外的布尔变量简化条件判断;
规则3:如果需要,创建自己的布尔变量。
有些语言,比如C,没有布尔变量,可以用typedef intBOOLEAN自定义之。
枚举类型
规则1:用枚举类型而非具名常量来提高可读性、可靠性、可修改性;
比如:星期几,颜色之类的,用枚举类型的变量来表示,程序就会很清晰明了。
规则2:当变量的用法不能仅用true和false表示时,有枚举类型取代布尔变量;
规则3:针对枚举类型的测试检测非法数值;
比如:结合switch{ case: case: }来使用就可以很方便地而检查非法数值;
规则4:把枚举类型的第一条保留为“非法的”;
很多编译器会把枚举类型的第一个元素赋值为0,把映射到0的那个元素声明为无效会有助于捕捉那些没有合理初始化的变量。
规则5:警惕给枚举元素明确赋值而带来的失误;
规则1:用具名常量而不是神秘数值来声明数据和表示循环界限
规则2:具名常量的使用保持一致
同一个实体只使用一个具名常量,否则是自找麻烦。
规则1:确保所有的数组下标都没有超出数组边界;
规则2:确保数组引用没有出现off-by-one错误;
规则3:确保多维数组的下标的顺序正确;
规则4:在嵌套循环里,把正确的变量用于数组下标来避免循环下标串话。