为什么/何时使用(!! p)而不是(p!= NULL)

时间:2009-10-22 08:10:04

标签: c++ null pointers boolean

在以下代码中,使用(!!p)代替(p != NULL)有什么好处?

AClass *p = getInstanceOfAClass();
if( !!p )
  // do something
else 
  // do something without having valid pointer

7 个答案:

答案 0 :(得分:11)

它几乎是一样的,虽然我认为!!p是不好的风格,并且通常表示编码器试图变得聪明。

答案 1 :(得分:9)

这是风格问题,实际上它们是等价的。请参阅this very similar question进行讨论。

IMO与空指针的比较更清晰。

答案 2 :(得分:7)

我认为GMan的原始评论应该是接受的答案:

  

我想知道只有if (p)

出了什么问题

重点是:没有错误,而 应该是首选方式。首先,!!p“太聪明了”;它也是完全不必要的,因此很糟糕(注意:我们在这里讨论if语句中的指针,所以Anacrolix的评论虽然通常有效,但在这里不适用!)。

p != NULL也是如此。虽然这是可能的,但它根本不需要。这是更多的代码,它完全是冗余的代码,因此它会使代码变得更糟。 Jeff Atwood曾经说过的最真实的事情是“最好的代码根本就没有代码。”避免冗余语法。坚持最低限度(仍然传达完整的含义; if (p) 完成)。

最后,if (p)可以说是用C ++编写它的最惯用的方式。 C ++向后弯曲以获得语言中其他类型(例如数据流)的相同行为,但代价是一些非常奇怪的怪癖。该标准的下一个版本甚至引入了新的语法,以在用户定义的类型中实现此行为。

对于指针,我们免费获得相同的信息。所以使用它。

/编辑:关于清晰度:sharptooth写道

  

IMO与空指针的比较更清晰。

我声称这是客观错误的:if (p)更清楚。在C ++中,无论是在这种情况下还是在任何其他情况下,这种陈述都不可能具有任何其他意义。

答案 3 :(得分:3)

据我所知,这只是将其转换为布尔值的一种较短方式。它适用于!但是,两次,p != NULL进行一次比较。所以我猜这个好处只是更短的代码,如果你不知道!!p应该是什么意思,那就更加神秘了。

答案 4 :(得分:0)

它们是相同的,但我建议使用

NULL != p

它更具可读性。

答案 5 :(得分:-1)

给出的例子没有区别。

然而,这适用于所有情况的假设是不正确的。 a = not not b a = b 不同,就整数类型而言。

在C中,0为假。除0之外的任何内容都是真的。但是not 01,而不是其他任何内容。在C ++中,true转换为1作为整数,不仅用于与C的向后兼容,而且因为1不是01是最常用的值在C bool类型中表示true,包括Win32中使用的official C bool typeBOOL

虽然对于给出的示例代码,!!p是不必要的,因为结果会转换为bool以评估if条件,但不排除使用{ {1}}用于将布尔值转换为预期的整数值。在这个例子中,为了最大限度地提高类型更改和语义清晰的可能性,我会使用!!NULL != p来清楚地表达它的含义。

这种技术被称为双重成语,this guy provides some good justifications

答案 6 :(得分:-2)

不要使用双重否定。一个简单的论点是,由于C ++是一个有限的英语子集,英语只是没有双重否定,因此英语使用者将很难解析正在发生的事情。

相关问题