&&、|| 的子表达式应为后缀表达式
10.1.11 ID_nonPostfixSubCondition
如果 &&、|| 的子表达式均为后缀表达式,可使逻辑结构更清晰,有效避免各种优先级问题。
后缀表达式(postfix-expression)是 C/C++ 语言的文法概念,也是一类表达式的总称:
- 只包含标识符或常量的表达式
- 用小括号括起来的表达式
- 用于数组元素求值的 [ ] 表达式
- 函数调用、函数式类型转换表达式
- .、-> 表达式
- 后置 ++、-- 表达式
- typeid 等表达式
本规则意在强调子表达式应适当地用括号括起来,以便提高可读性,并确保程序的行为符合开发者的意图。
示例(设 a、b、c 为 bool 型变量,n 为整型变量):
if (n == 0 && b) { // Non-compliant
....
}
例中 n == 0 不是后缀表达式,应使用括号括起来:
if ((n == 0) && b) { // Compliant
....
}
又如:
if (a || b && c) { // Non-compliant
....
}
即使知道 && 的优先级高于 ||,也应使用括号将 || 的子表达式括起来,如:
if (a || (b && c)) { // Compliant
....
}
例外:
if (a || b || c)) { // Compliant
....
}
当 &&、|| 的子表达式运算符与其相同时,可不受本规则约束。
依据
ISO/IEC 9899:1999 6.5.2(1)
ISO/IEC 9899:2011 6.5.2(1)
ISO/IEC 14882:2003 5.2(1)
ISO/IEC 14882:2011 5.2(1)
参考
MISRA C++ 2008 5-2-1