☰
  • 首页
  • 规则分类
  • 项目介绍
search
•••

逻辑表达式的右子表达式不应有副作用

10.1.6 ID_shortCircuitSideEffect
目录 › next › previous

逻辑表达式的右子表达式有副作用会使代码变得复杂易错,不利于阅读和维护。

对于逻辑表达式的求值,标准规定从左至右计算各子表达式的值,当可以确定整个表达式的值时,即使还有未计算的子表达式,也会立即结束求值,这种方法可提高效率,称为“短路规则(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
Copyright©2024 360 Security Technology Inc., Licensed under the Apache-2.0 license.