本节书摘来自华章计算机《编写高质量代码:改善c程序代码的125个建议》一书中的第2章,建议16-3,作者:马 伟 更多章节内容可以访问云栖社区“华章计算机”公众号查看。
建议16-3:尽量避免在表达式中使用默认的优先级
在C语言中,运算符的优先级如表2-1所示。
虽然C语言中的运算符都有自己的优先级别,但是为了提高程序的可读性,防止阅读程序时产生误解,防止因默认的优先级与设计思想不符而导致程序出错,我们应该尽量避免使用默认的优先级。如果代码行中的运算符比较多,应当用括号明确表达式的计算顺序,从而避免采用默认的运算符优先级。
来看下面的示例代码:
if ((a | b) && (a & c))
{
/*处理代码*/
}
if ((a | b) < (c & d))
{
/*处理代码*/
}
在上面的代码中,我们用括号来明确表达式的计算顺序,使程序看起来非常直观,具有良好的可读性。现在,我们采用默认的运算符优先级来改写上面的代码:
if (a | b && a & c)
{
/*处理代码*/
}
if (a | b < c & d)
{
/*处理代码*/
}
根据表2-1的运算符优先级原则,“a | b && a & c”等价于“ (a | b) && (a & c)”,第一个if语句“if (a | b && a & c)”不会出错,但语句却不易理解;再来看第二个if语句“if (a | b < c & d)”,因为“<”运算符的优先级比“|”与“&”运算符高,所以“a | b < c & d”等价于“a |(b < c)& d”,这就造成了判断条件出错。
最后还需要说明的是,除了可以通过括号的方式来明确表达式的计算顺序,避免使用默认的运算符优先级,还需要遵循表达式简洁原则,尽量避免在表达式中把不同类型的操作符混合起来。