运算符的优先级:一元运算符+ - *的优先级高于对应的二元运算符
【规则 4-1-1】 如果代码行中的运算符比较多,用括号确定表达式的操作顺序,避免使用默认的优先级。
复合表达式:如a = b = c = 0
存在的理由1)书写简洁;2)可以提高编译效率。
【规则 4-2-1】 不要编写太复杂的复合表达式。
【规则 4-2-2】 不要有多用途的复合表达式。
如: d = (a = b + c) + r ; 该表达式既求 a 值又求 d 值。
【规则 4-2-3】 不要把程序中的复合表达式与“真正的数学表达式”混淆。
如: if (a < b < c) // a < b < c 是数学表达式而不是程序表达式
并不表示 :if ((a
而是成了令人费解的 if ( (a
if语句:以“与零值比较”为例
布尔变量与零值比较
【规则 4-3-1】 不可将布尔变量直接与 TRUE 、FALSE 或者1、0进行比较。
如:假设布尔变量名字为 flag,它与零值比较的标准 if 语句如下:
if (flag) // 表示 flag 为真
if (!flag) // 表示 flag 为假
其它的用法都属于不良风格, 例如:
if (flag == TRUE)
if (flag == 1 )
if (flag == FALSE)
if (flag == 0)
整型变量与零值比较
【规则 4-3-2】 应当将整型变量用“==”或“! =”直接与 0 比较。
如:假设整型变量的名字为 value, 它与零值比较的标准 if 语句如下:
if (value == 0)
if (value != 0)
不可模仿布尔变量的风格而写成
if (value) // 会让人误解 value 是布尔变量
if (!value)
浮点变量与零值比较
【规则 4-3-3】 不可将浮点变量用“==”或“!=”与任何数字比较。
千万要留意, 无论是 float 还是 double 类型的变量,都有精度限制。所以一定要避免将浮点变量用“==”或“!=” 与数字比较,应该设法转化成“>=”或“<=”形式。
如:假设浮点变量的名字为 x,应当将
if (x == 0.0) // 隐含错误的比较
转化为
if ((x>=-EPSINON) && (x<=EPSINON))
其中 EPSINON 是允许的误差( 即精度)。
指针变量与零值比较
【规则 4-3-4】 应当将指针变量用”==”或”!=”与NULL比较。
对if语句的补充说明
if (NULL == p) 取代 if (p == NULL):防止将”==”误写成”=”,编译器又不报错
if (condition) 改写成: if (condition) 或者: return (condition ? x : y);
return x; {
return y; return x;
}
else
{
return y;
}
循环语句的效率
【建议 4-4-1】 在多重循环中,如果有可能,应当将最长的循环放在最内层,最短的循环放在最外层,以减少 CPU 跨切循环层的次数。例如示例 4-4(b) 的效率比示例4-4(a) 的高。
【建议 4-4-2】 如果循环体内存在逻辑判断,并且循环次数很大,宜将逻辑判断移到 循环体的外面。如果 N 非常大,最好采用判断逻辑外提的写法,可以提高效率。如果 N 非常小,两者效率差别并不明显,不需将判断逻辑外提,因为程序更加简洁。
for语句的循环控制变量
【规则 4-5-1】 不可在 for 循环体内 修改循环变量,防止 for 循环失去控制。
【建议 4-5-1】 建议 for 语句的循环控制变量的取值采用“半开半闭区间”写法。
switch语句
switch (variable)
{
case value1 : …
break;
case value2 : …
break;
…
default : …
break;
}
【规则 4-6-1】 每个 case 语句的结尾不要忘了加 break,否则将导致多个分支重叠(除非有意使多个分支重叠)。
【规则 4-6-2】不要忘记最后那个 default 分支。 即使程序真的不需要 default 处理,也应该保留语句 default : break; 这样做并非多此一举,而是为了 防止别人误以为你忘default 处理。