不应存在没有副作用的语句
8.22 ID_missingSideEffect
不能对程序状态产生影响的语句称为无“副作用(side effect)”的语句,往往属于笔误或调试痕迹,应当修正或去除。
示例(设 a、b、p 为变量或指针):
a == b; // Non-compliant
单纯的判等是没有副作用的,很可能是赋值语句的笔误。
*p++; // Non-compliant
单纯从某个地址进行读取是没有副作用的,这是一种对运算符优先级理解不当造成的常见错误,应改为 (*p)++;
p->fun; // Non-compliant
由变量名或无实参列表的函数名作为一个语句是没有副作用的,此语句应改为正确的函数调用。
+a; // Non-compliant
正号是没有副作用的,此句很可能应为 ++a;
如果语句为逻辑与表达式,左子表达式可以作为右子表达式的条件,故左子表达式可以无副作用,而右子表达式一定要有副作用,如:
p && p->fun(); // OK
p && p->fun; // Non-compliant
p->fun() && p; // Non-compliant
如果语句为逻辑或表达式,则要求其左右子表达式均有副作用,如:
p || p->fun(); // Non-compliant
p || p->fun; // Non-compliant
p->fun() || p; // Non-compliant
依据
ISO/IEC 9899:1999 5.1.2.3(2)
ISO/IEC 9899:2011 5.1.2.3(2)
ISO/IEC 14882:2003 1.9(7)
ISO/IEC 14882:2011 1.9(12)