4.1 运算符的优先级
优先级 | 运算符 | 结合律 |
从 高 到 低 排 列 | ( ) [ ] -> . | 从左至右 |
! ~ ++ -- (类型) sizeof + - * & | 从右至左 | |
* / % | 从左至右 | |
+ - | 从左至右 | |
<< >> | 从左至右 | |
< <= > >= | 从左至右 | |
== != | 从左至右 | |
& | 从左至右 | |
^ | 从左至右 | |
| | 从左至右 | |
&& | 从左至右 | |
|| | 从右至左 | |
?: | 从右至左 | |
= += -= *= /= %= &= ^= |= <<= >>= | 从左至右 |
在表达式中使用括号,是表达式的运算顺序更加清晰
说明:为了防止产生歧义并提高可读性,应当用括号确定表达式的操作顺序
示例 :
word = (high << 8) | low
if ((a | b) && (a & c))
4.2 复合表达式
4.2.1 不要编写太复杂的复合表达
示例 :
i = a >= b && c < d && c + f <= g + h ; // 复合表达式过于复杂
4.2.2 不要有多用途的复合表达式
示例 :
d = (a = b + c) + r ;
该表达式既求a 值又求d 值。应该拆分为两个独立的语句:
a = b + c;
d = a + r;
4.3 if语句
4.3.1 不可将bool变量直接与True、False或者1、0进行比较
说明:True和False的定义值和语言环境相关的,且可能会被重新定义
示例 :
设bFlag 是bool类型的变量
if (bFlag) // compliant 表示flag为真
if (!bFlag) // compliant 表示flag为假
if (bFlag == TRUE) // Non-compliant
if (bFlag == 1) // Non-compliant
if (bFlag == FALSE) // Non-compliant
if (bFlag == 0) // Non-compliant
4.3.2 应当将整形变量用 “==” 或 “!=” 直接与0比较
示例 :
假设整型变量的名字为value
if (Value == 0) // compliant
if (Value != 0) // compliant
if (Value) // Non-compliant 会让人误解 Value是布尔变量
if (!Value) // Non-compliant
4.3.3 不可将浮点变量用 “==” 或 “!=” 与任何数字比较
说明:无论是float还是double类型都有精度限制,所以一定要避免浮点变量用“==”或“!=”与数字比较,应该转化成 “>=” 或 “<=” 形式
示例 :
if ((fResult >= -EPSINON) && (fResult <= EPSINON)) // compliant
其中EPSINON是允许的误差(即精度)。
if (fResult == 0.0) // Non-compliant 隐含错误的比较
4.3.4 应该将指针变量用 “==” 或 “!=” 与NULL比较
说明:指针变量的零值是“空”(记为NULL),即使NULL的值与0相同,但是两者意义不同
示例 :
if ( NULL == pHead ) // compliant 强调pHead是指针变量
if ( pHead != NULL ) // compliant 强调pHead是指针变量
if (pHead == 0) // Non-compliant 容易让人误解pHead是整型变量
if (pHead != 0) // Non-compliant 容易让人误解pHead是整型变量
if (pHead) // Non-compliant容易让人误解pHead是布尔变量
if (!pHead) // Non-compliant容易让人误解pHead是bool变量
4.4 循环语句
4.4.1 不可在for循环体内修改循环变量,防止for循环失去控制
示例 :
for ( x = 0; x < 10; )
{
x = x * 2; // Non-compliant
}