逻辑表达式的右子表达式不应有副作用
10.1.6 ID_shortCircuitSideEffect
逻辑表达式的右子表达式有副作用会使代码变得复杂易错,不利于阅读和维护。
对于逻辑表达式的求值,标准规定从左至右计算各子表达式的值,当可以确定整个表达式的值时,即使还有未计算的子表达式,也会立即结束求值,这种方法可提高效率,称为“短路规则(short-circuit evaluation)”。
逻辑表达式的右子表达式受左子表达式影响,可能不会被执行,如果有副作用也可能不会生效。
示例:
if (a == foo || b == bar++) { // Non-compliant
do_something(bar); // Consider that ‘bar++’ may not be evaluated
}
如果 a == foo 为真,不论 b 是否等于 bar++,整个条件表达式的值一定为真,所以 b == bar++ 不一定会被执行,需要同时考虑 bar++ 执行与未执行的两种状态,很容易产生错误,也不利于阅读和维护。
依据
ISO/IEC 9899:1999 6.5.13(4)
ISO/IEC 9899:1999 6.5.14(4)
ISO/IEC 9899:2011 6.5.13(4)
ISO/IEC 9899:2011 6.5.14(4)
参考
MISRA C 2004 12.4
MISRA C 2012 13.5
MISRA C++ 2008 5-14-1