不应存在无意义的重复子表达式
10.1.1 ID_illIdentical
逻辑与、逻辑或、按位与、按位或的子表达式以及三元表达式的两个分枝不应重复,否则相关运算会失去意义。
示例:
void foo(int* p, int* q) {
if (p != NULL && p != NULL) { // Non-compliant
....
}
}
void bar() {
while (FLAG0 | FLAG1 | FLAG0) { // Non-compliant
....
}
}
char baz(bool x) {
return x? 'a': 'a'; // Non-compliant
}
例中重复的子表达式都是有问题的,这是很常见的错误,多由复制粘贴引起。修正时不应只删去重复项,还要考虑是否漏掉了某些项。
例外:
void qux(ifstream& f) {
if (f.get() == 'a' && f.get() == 'a') { // Let it go
....
}
}
具有副作用的逻辑子表达式可不受本规则约束。例中重复的子表达式可以改变文件流的状态,但第二个子表达式可能不会被执行,这种代码即使没有逻辑错误也是不便于维护的,参见 ID_shortCircuitSideEffect。