(!!p)
而不是(p != NULL)
的好处是什么?AClass *p = getInstanceOfAClass();
if( !!p )
// do something
else
// do something without having valid pointer
这两种写法基本相同,但是我认为!!p
不好,通常表明编码者试图过于聪明。
我认为GMan的原始评论应该被接受为答案:
我想知道仅使用
if (p)
有什么问题
关键是:没有任何问题,这应该是首选的方式。首先,!!p
太聪明了;它也完全不必要,因此是错误的(请注意:我们在这里谈论指针在 if
语句中的情况,因此 Anacrolix 的评论虽然通常有效,但在这里不适用!)。
p != NULL
也是如此。虽然这是可能的,但是它只是不需要的。它是多余的代码,使代码变得更糟糕。Jeff Atwood 曾经说过:“最好的代码就是没有代码。” 避免冗余的语法。坚持最小化(仍然传达完整含义;if (p)
是完整的)。
最后,if (p)
可以说是在 C++ 中编写此类代码的最习惯用法。C++ 为语言中的其他类型(例如数据流)倒退弯腰,以获取相同的行为,代价是一些非常奇怪的怪癖。下一个标准版本甚至引入了新的语法,以在用户定义的类型中实现此行为。
对于指针,我们可以免费获得相同的功能。所以使用它。
/EDIT:关于清晰度:sharptooth 写道
我认为与 null 指针进行比较更清晰。
我认为这是客观错误的:if (p)
更清晰。在 C++ 中,在此上下文中或任何其他情况下都不可能有任何其他含义。
p!= NULL
提供了冗余信息。与if(p)
相比有什么好处? - Konrad Rudolphp != NULL
只进行了一次比较。因此,我想好处只是更短的代码,尽管如果你不知道!!p
的含义,它可能会更加神秘。它们是相同的,但我建议使用
NULL != p
这样更易读。
!!p
和p != NULL
都更易读。那些忽略警告的开发者应该花费数小时来寻找“条件中的赋值”错误——这样做没有其他原因,只是为了学会不要忽略警告。像DevSolar一样,我也强烈反对为懒散的开发实践引入变通方法。 - Bojan ResnikNULL != p
。这更易读。'也许只是我的理解,但我认为'Catalin'实际上想表达 'NULL != p
比这两个都更易读。' - Bojan Resnik在给定的示例中没有区别。
然而,假设这适用于所有情况是不正确的。就整数类型而言,a = not not b 不等同于 a = b。
在 C 中,0
为假。除了 0
以外的任何值都为真。但是 not 0
是 1
,没有其他值。在 C++ 中,true 转换为 1
作为整数,这不仅是为了与 C 向后兼容,而且因为 1
不是 0
,并且 1
是用于表示 C bool 类型中的 true 的最常见值,包括 official C bool type 和 Win32 中使用的 BOOL
。
虽然对于给定的示例代码,!!p
是不必要的,因为结果被转换为 bool
以评估 if
条件,但这并不排除使用 !!
将布尔值转换为预期的整数值。就个人而言,在这个例子中,为了最大化类型更改和语义清晰的可能性,我会使用 NULL != p
或 p != NULL
来明确表示意思。
这种技术被称为双重否定习惯用语,this guy provides some good justifications。
不要使用双重否定。一个简单的论点是,由于C++是英语的有限子集,而英语本身并没有双重否定,因此英语母语者将会很难解析发生了什么。
</离题>
- Konrad Rudolph
if (p)
不行。 - GManNickG!p
或!=
可能具有特殊行为。 - KobiObject* operator+(Object const*, Object const*)
作为有效的签名... - Matthieu M.