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

C++ 为什么/何时使用(!!p)而不是(p!=NULL),c++,null,pointers,boolean,C++,Null,Pointers,Boolean,在下面的代码中,使用(!!p)而不是(p!=NULL)有什么好处 这是风格的问题,事实上它们是等价的。请参阅以进行讨论 我比较空指针更清楚。据我所知,这只是将其转换为布尔值的较短方法。它适用于!但是两次,而p!=NULL执行一次比较。所以我想好处只是代码更短,尽管如果你不知道是什么,它会更神秘!!P意味着.< /P> ,几乎是相同的,尽管我考虑了!!p是一种糟糕的风格,通常表示程序员试图变得聪明。它们是一样的,但我建议使用 NULL != p 它更具可读性。Do!!不要使用双重否定。一个简单的

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


这是风格的问题,事实上它们是等价的。请参阅以进行讨论


我比较空指针更清楚。

据我所知,这只是将其转换为布尔值的较短方法。它适用于!但是两次,而
p!=NULL执行一次比较。所以我想好处只是代码更短,尽管如果你不知道
是什么,它会更神秘!!P<代码>意味着.< /P> 

,几乎是相同的,尽管我考虑了<代码>!!p

是一种糟糕的风格,通常表示程序员试图变得聪明。

它们是一样的,但我建议使用

NULL != p

它更具可读性。

Do!!不要使用双重否定。一个简单的论点是,由于C++是有限的英语子集,英语只是没有双重否定,所以说英语的人将很难分析正在发生的事情。 然而,认为这适用于所有情况的假设是不正确的<就整数类型而言,strong>a=not not b与a=b不同

在C语言中,
0
为false。除了
0
之外的任何内容都是正确的。但是
不是0
1
,其他什么都不是。在C++中,真的将代码转换为<代码> 1 /代码>,不仅是与C的向后相容性,而且因为<代码> 1 < /COD>不是<代码> 0 >代码>,而<代码> 1 >代码>是用于在C布尔类型中表示真的最常用的值,包括在Win32中使用的“和”代码“BOOL ”。
而对于给定的示例代码,
!!p
是不必要的,因为结果被转换为
bool
以评估
如果
条件,这并不排除使用
用于将布尔值强制转换为期望的整数值。就我个人而言,在本例中,为了最大限度地提高类型更改和语义清晰的可能性,我将使用
NULL!=p
p!=NULL
以明确其含义


这种技巧被称为“双关语”,我认为格曼的原话应该是公认的答案:


我想知道如果(p)

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

p!=空
。虽然这是可能的,但并不需要。它是更多的代码,它是完全冗余的代码,因此它使代码变得更糟。杰夫·阿特伍德曾经说过的最真实的一句话是“最好的代码是根本没有代码。”避免冗余语法。坚持最低限度(如果(p)
已完成,仍能传达完整的含义;

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

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

/编辑:关于清晰度:夏普顿写道

IMO比较空指针更清晰


我声称这在客观上是错误的:
如果(p)
更清楚。在C++中,没有任何可能的方式,在这方面也没有任何其他的含义。

我想知道,如果<代码> >(p)< />代码,那么什么是错误的。这是可能的
!p
=有特殊的行为。Kobi-我不记得了,但是重载运算符是否也适用于指向对象的指针?似乎他们不会;如果我是对的,在这种情况下,实际上不存在任何重载运算符问题。(不管我是否正确,这是一个很好的观点,它本身就值+1)他们确实可以
Object*操作符+(Object const*,Object const*)
是一个有效的签名……@Twisol:不,你第一次是对的。对于非类/非枚举类型,不能重载运算符。非成员重载不会改变任何东西。如果需要,可以声明它,但过载解决方案永远不会考虑它。在最初的示例(指针类型)中,运算符重载是不可能的。它的可读性是有争议的。就我个人而言,我觉得它不那么可读,只是因为它读起来不自然。我通常会说‘如果p不为NULL,那么‘如果NULL不为p,那么就不为’。是的,但它确实可以防止人们遗漏错误的“p=NULL”,因为编译器会拾取“NULL=p”。@ChrisBD:我知道的任何编译器也拾取“p=NULL”。除非您禁用了警告,否则您永远不应该这样做。我同意它比双重否定更具可读性,但是我反对您声称它比两者都更具可读性的说法
!!p
p!=空
。忽略警告的开发人员应该花上几个小时搜索“条件中的分配”错误——除了学会不忽略警告之外,别无其他原因。与DevSolar一样,我也强烈希望为草率的开发实践引入变通方法。OP:“使用(!!p)而不是(p!=NULL)'Catalin有什么好处:'它们是相同的,但我建议使用
NULL!=p
它更具可读性。“也许只是我,但我把它理解为”
NULL!=p
比这两个词都可读。除非你也上了拉丁语课,那么双重否定——取决于上下文——不会抵消,但否定的含义会被放大。除了这个!(C++是英语的一个有限子集)。
NULL != p