在以下代码中,使用(!!p)
代替(p != NULL)
有什么好处?
AClass *p = getInstanceOfAClass();
if( !!p )
// do something
else
// do something without having valid pointer
答案 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 0
是1
,而不是其他任何内容。在C ++中,true转换为1
作为整数,不仅用于与C的向后兼容,而且因为1
不是0
,1
是最常用的值在C bool类型中表示true,包括Win32中使用的official C bool type和BOOL
。
虽然对于给出的示例代码,!!p
是不必要的,因为结果会转换为bool
以评估if
条件,但不排除使用{ {1}}用于将布尔值转换为预期的整数值。在这个例子中,为了最大限度地提高类型更改和语义清晰的可能性,我会使用!!
或NULL != p
来清楚地表达它的含义。
这种技术被称为双重成语,this guy provides some good justifications。
答案 6 :(得分:-2)
不要使用双重否定。一个简单的论点是,由于C ++是一个有限的英语子集,英语只是没有双重否定,因此英语使用者将很难解析正在发生的事情。