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

时间:2014-01-10 07:13:41

标签: c++

if(x==0)if(!x)的区别是什么?或者他们总是相同?对于不同的C ++内置类型的x

  • bool
  • int
  • char
  • pointer
  • iostream
  • ...

5 个答案:

答案 0 :(得分:2)

  

如果(!x)的

是“如果x不是假”,这意味着为了评估它,您可能必须将x转换为bool。

>> 这可能有害,如果您想避免它,您应该使用类似Safe Bool Idiom

的内容
  

如果(X!= 0)

表示“如果x不为0”,则评估将x与0进行比较。这可能还涉及隐式转换。

>> 当以这种方式使用指针时要小心,C ++ 11引入了 nullptr 以避免混淆 NULL == 0 (语义不同):What exactly is nullptr?

答案 1 :(得分:2)

假设存在从某种类型转换为支持if (x)if (!x)的内容的转换,那么只要operator int()的转换不是opterator bool()而不是if (x == 0) ,结果将是一样的。

bool将使用“最佳”转换,其中包含void *if(!x)转换器。只要有任何转换器可以将类型转换为某种“标准类型”。

class { int x; public: bool operator bool() { return x != 0; } int operator int() { return x == 0; } }; 将完全相同,它将使用任何转换为​​标准类型的转换器。

这两个当然都假设转换器功能不是C ++ 11“不要默认转换”。

当然,如果你有这样的课程:

if (x == 0)

然后if ( (x == 0) == 0)if (!x)if (! (x != 0)operator int()执行false,这是不一样的。但现在我们真的在努力制造麻烦,这是非常糟糕的设计代码。

当然,上述示例可能会导致任何x == 0出错,导致true {{1}}和{{1}}所有其他值。

答案 2 :(得分:1)

考虑您要处理的内容

如果它是 boolean ,结果非常清楚:

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

对于 chars ,两个条件都给出了相同的结果:

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

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

答案 3 :(得分:0)

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

if(cin)

在stl中使用

来检查iostream类型是否没有错误。没有等效的cin!= 0。

此外,大多数运营商也可以过载和转换。

答案 4 :(得分:0)

只需!x 将为每个“false”值返回true(即0,null,false等),而 x!= 0 将返回true, iff x不等于 0