4.1 运算符的优先级
规则4-1-1 如果代码行中的运算符比较多,用括号确定表达式的操作顺序,避免使用默认的优先级。
4.2 复合表达式
规则4-2-1 不要编写太复杂的复合表达式。
规则4-2-2 不要有多用途的复合表达式。
规则4-2-3 不要把程序中的复合表达式与“真正的数学表达式”混淆。
4.3 if 语句
4.3.1 布尔变量与零值比较
规则4-3-1不可将布尔变量直接与TRUE、FALSE或者1、0进行比较。
假设布尔变量名字为flag,它与零值比较的标准if语句如下:
if (flag) // 表示flag为真
if (!flag) // 表示flag为假
注:TRUE的值究竟是什么并没有统一的标准。根据布尔类型的定义,零值为“假”(记为 FALSE),任何非零值都是“真”(记为TRUE)。
4.3.2 整型变量与零值比较
规则4-3-2应当将整型变量用“==”或“!=”直接与 0 比较。
if (value == 0)
4.3.3 浮点变量与零值比较
规则4-3-3不可将浮点变量用“==”或“!=”与任何数字比较。
if ((x >= -EPSION) && (x <= EPSION)) // 其中EPSION是允许的误差(即精度)。
4.3.4 指针变量与零值比较
规则4-3-4应当将指针变量用“==”或“!=”与 NULL 比较。
4.3.5 对 if语句的补充说明
将if (p == NULL)误写成if (p = NULL),而有意把p和NULL颠倒。编译器认为if (p = NULL)是合法的,但是会指出if (NULL = p)是错误的,因为NULL不能被赋值。
程序中有时会遇到 if/else/return 的组合,应该将如下不良风格的程序
if (condition)
return x;
return y;
改写为
if (condition)
{
return x;
}
else
{
return y;
}
或者改写成更加简练的
return (condition ? x : y);
4.4 循环语句的效率
提高循环体效率的基本办法是降低循环体的复杂性。
建议4-4-1 在多重循环中,如果有可能,应当将最长的循环放在最内层,最短的循环放在最外层,以减少 CPU 跨切循环层的次数。
建议4-4-2 如果循环体内存在逻辑判断,并且循环次数很大,宜将逻辑判断移到循环体的外面。示例 4-4(c)的程序比示例 4-4(d)多执行了 N-1 次逻辑判断。并且由于前者老要进行逻辑判断,打断了循环“流水线”作业,使得编译器不能对循环进行优化处理,降低了效率。如果 N 非常大,最好采用示例 4-4(d)的写法,可以提高效率。如果 N 非常小,两者效率差别并不明显,采用示例 4-4(c)的写法比较好,因为程序更加简洁。
4.5 for 语句的循环控制变量
规则4-5-1不可在for 循环体内修改循环变量,防止for 循环失去控制。
建议4-5-1 建议 for 语句的循环控制变量的取值采用“半开半闭区间”写法。
4.6 switch语句
switch是多分支选择语句。
规则4-6-1 每个 case 语句的结尾不要忘了加 break,否则将导致多个分支重叠(除非有意使多个分支重叠)。
规则4-6-2 不要忘记最后那个 default 分支。即使程序真的不需要 default 处理,也应该保留语句 default : break; 这样做并非多此一举,而是为了防止别人误以为你忘了 default 处理。
4.7 goto语句
跳出多重循环体中。