条件检查:if(x==0) vs. if(!x)

Condition checking: if(x==0) vs. if(!x)

本文关键字:if vs 检查 条件      更新时间:2023-10-16

if(x==0)和有什么区别。 if(!x) ?还是它们总是等价的?对于不同C++内置类型的x

  • bool
  • int
  • char
  • pointer
  • iostream

假设有一个类型到支持if (x)if (!x)的东西的转换,那么只要operator int()没有与opterator bool()不同的转换,结果将是相同的。

if (x == 0)将使用"最佳"转换,其中包括boolvoid *转换器。只要有任何转换器可以将类型转换为某种"标准类型"。

if(!x)将执行完全相同的操作,它将使用任何转换为标准类型的转换器。

当然,这两个都假设转换器函数不是 C++11"不默认转换"。

当然,如果你有这样的类:

class
{
   int x;
  public:
   bool operator bool() { return x != 0; }
   int operator int() { return x == 0; } 
}; 

然后if (x == 0)会做if ( (x == 0) == 0)if (!x)会做if (! (x != 0),这是不一样的。但是现在我们真的在试图制造麻烦,这是设计非常糟糕的代码。

当然,上面的示例可能会出错,任何不会导致x == 0 false和所有其他值true operator int()

if(!x)

是"如果 x 不是假的",这意味着为了评估这一点,你可能必须将 x 转换为布尔值。

>> 这可能是有害的,如果你想避免它,你应该使用类似安全布尔成语的东西


if(x!=0)

表示"如果 x 不是 0",因此将 x 与 0 进行比较进行评估。这可能还涉及隐式转换。

>> 以这种方式使用指针时要小心,C++11 引入了一个 nullptr 以避免 NULL==0 的混淆(语义不同): nullptr 到底是什么?

考虑您要处理的内容

如果是布尔值,结果非常清楚:

if (!false)   // If false TRUE
if (false==0) // If false TRUE

如果是整数,注意!条件

if (0==0) // Unexpected behaviors are missing..
if (!-1) // False
if (! 0) // True
if (! 1) // False

对于字符,这两个条件给我相同的结果:

if (! ' ')  // nothing
if (' '==0) // nothing
if (! 'z')  // nothing
if ('z'==0) // nothing

不,这一切都取决于x的类型。例如

if(cin)

在 STL 中用于检查 IOstream 类型是否没有错误。没有等效的 cin != 0。

此外,大多数运算符都是可重载的,也可以转换。

简单地说x 将为每个"假"值(即 0、空、假等)返回 true,而 x!=0 将返回真,iff x 不等于 0