16 May 2023

C++ 核心指南目录

“Don’t add redundant == or != to conditions”

理由

这样可以避免累赘,规避某些导致出错的时机。提升统一和惯例的风格

例子

根据定义,条件是指在 if 语句、 while 语句、 for 语句判断 truefalse 的地方。数值与 0 比较,指针值与 nullptr 比较。

// These all mean "if p is not nullptr"
if (p) { ... }            // good
if (p != 0) { ... }       // redundant !=0, bad: don't use 0 for pointers
if (p != nullptr) { ... } // redundant !=nullptr, not recommended

通常, if (p) 的意思是 p 是否合法有效,能直接表明程序员的意图,而 if (p != nullptr) 则显得有些多余。

例子

此规则尤其适用于某种表达一个逻辑条件的声明。

// execute if ps points to a kind of Circle, good
if (auto pc = dynamic_cast<Circle>(ps)) { ... }
// not recommended
if (auto pc = dynamic_cast<Circle>(ps); pc != nullptr) { ... }

例子

注意,逻辑条件会隐式地转成 bool 值。比如:

for (string s; cin >> s; ) v.push_back(s);

这里调用了 istreamoperator bool()

注意

整型数值与 0 比较并不多余。理由是,整型通常有多个合理的值,0 只是其中一个可能的值。而指针和 bool 值则不一样。对于整型来说,0 通常意味着成功执行。所以,还是清晰表明这种判断为好。

void f(int i)
{
    if (i)            // suspect
    // ...
    if (i == success) // possibly better
    // ...
}

请记住,整型可以有大于两个的有效值。

坏例子

if(strcmp(p1, p2)) { ... }
// are the two C-style strings equal? (mistake!)

这是常见的初级错误。如果你是用 C 风格的字符串,你必须熟悉 <cstring> 中的函数。以上例子等价于:

if(strcmp(p1, p2) != 0) { ... }
// are the two C-style strings equal? (mistake!)

依然是错误的判断。

注意

相反情况用否定表达式更直白:

// These all mean "if p is nullptr"
if (!p) { ... }           // good
if (p == 0) { ... }       // redundant == 0, bad: don't use 0 for pointers
if (p == nullptr) { ... } // redundant == nullptr, not recommended

强化

容易,只要检查在逻辑条件中是否有多余的 !===