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

Jua*_*cek 7 c++ null pointers boolean

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

AClass *p = getInstanceOfAClass();
if( !!p )
  // do something
else 
  // do something without having valid pointer
Run Code Online (Sandbox Code Playgroud)

Wer*_*sey 11

它几乎是一样的,虽然我认为这!!p是一种糟糕的风格,并且通常表明一个程序员试图变得聪明.

  • 如果花了一个小时来编写聪明的代码,那么几周之后你就会花两个时间来理解它. (4认同)
  • 我完全同意.它应该读"试图聪明,失败" (2认同)

sha*_*oth 9

这是一个风格问题,实际上它们是等价的.请参阅此非常相似的问题进行讨论.

IMO与空指针的比较更清楚.


Kon*_*lph 7

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

我想知道什么是错的 if (p)

重点是:它没有任何问题,这应该是首选方式.首先,!!p是"太聪明"; 它也是完全不必要的,因此也很糟糕(注意:我们在if这里的声明中讨论指针,所以Anacrolix的评论虽然通常有效,但在这里不适用!).

同样的道理p != NULL.虽然这是可能的,但它根本不需要.这是更多的代码,它是完全冗余的代码,因此它使代码变得更糟.Jeff Atwood曾经说过的最真实的事情是"最好的代码根本就没有代码."避免冗余语法.坚持以最小的(仍然传达了完整的意思; if (p) 完成).

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

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

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

IMO与空指针的比较更清楚.

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

  • 我更喜欢为布尔类型保留if(x),为指针类型保留if(x!= nullptr/*或NULL*/).这样你的指针检查在代码中突出,很容易搜索. (2认同)