C++ 在C+;中检查空指针的首选方法是什么+;?

C++ 在C+;中检查空指针的首选方法是什么+;?,c++,pointers,null,coding-style,C++,Pointers,Null,Coding Style,备选方案A: if (NULL == pSomethingColumn) // Yes, we use Yoda conditions if (NULL != pSomethingColumn) 或 我正在寻找解释推理的参考资料 我听一些人说,从技术上讲,NULL不必被定义为0,但是,拜托!如果是这样,那么吸盘(我们的应用程序)将以不同的方式崩溃 因此,如果NULL!=0,那么我们将遇到大问题 请帮我解决一场毫无意义的语法辩论。我对这两种方式都不特别感兴趣;只是在寻找官方途径。谢谢 我们使用V

备选方案A:

if (NULL == pSomethingColumn) // Yes, we use Yoda conditions
if (NULL != pSomethingColumn)

我正在寻找解释推理的参考资料

我听一些人说,从技术上讲,
NULL
不必被定义为
0
,但是,拜托!如果是这样,那么吸盘(我们的应用程序)将以不同的方式崩溃

因此,如果
NULL!=0,那么我们将遇到大问题

请帮我解决一场毫无意义的语法辩论。我对这两种方式都不特别感兴趣;只是在寻找官方途径。谢谢


我们使用VisualStudioC++编译器。

两个都没有明显优于另一个。从技术角度看,它们是等价的。指针上下文中的数字0并不意味着所有位都为零;它被定义为等价于用于表示空指针的任何位模式

NULL
可以定义为
0
(void*)0
。这两个定义都是语法性的,并且没有说明底层的位表示

因此,就技术正确性而言,
if(!p)
if(p==NULL)
if(p==0)
是相同的

这是一个风格问题。像所有样式问题一样,您的第一个倾向应该是匹配任何流行的编码标准。执行与代码库其余部分相同的操作。如果没有流行的标准,那就归结为个人偏好,你会被鼓励与同龄人一起制定编码标准


(个人)我喜欢使用显式比较,为布尔值保留较短的语法,但我很乐意使用<代码>如果((p))< /代码>这是其他人正在做的事情。

< P>我认为零对应于假和非零对应于真的历史意外;我只想保留布尔表达式的形式。但是,在其他人的代码中看到该表单并没有问题

我的投票:

if (pSomethingColumn == NULL)

不,我从来没有忘记过一个等号。只是运气好,或者可能非常小心。

< p> C++ >代码> null <代码>在每个实现中都必须是空指针常量。code>0
作为常量表达式,它始终是空指针常量(即,当转换为指针类型时,它会产生空指针值)。这两种情况都不意味着任何给定指针类型的空指针值必须由零或所有位为零的地址表示,但从应用程序开发人员的角度来看,这主要是学术性的

要使用
NULL
,您应该
#包括定义它的头,例如
;您可以始终使用
0

当转换为
bool
时,空指针值始终转换为
false
;任何其他指针值始终转换为
true

当用作一元
的参数时指针值如上所述转换为
bool
,然后取反

只要定义了
NULL
,它们都是等效的:

if (NULL == pSomethingColumn)
if (pSomethingColumn == NULL)
if (0 == pSomethingColumn)
if (pSomethingColumn == 0)
if (!pSomethingColumn)
if (NULL != pSomethingColumn)
if (pSomethingColumn != NULL)
if (0 != pSomethingColumn)
if (pSomethingColumn != 0)
if (pSomethingColumn)
这些都是等价的:

if (NULL == pSomethingColumn)
if (pSomethingColumn == NULL)
if (0 == pSomethingColumn)
if (pSomethingColumn == 0)
if (!pSomethingColumn)
if (NULL != pSomethingColumn)
if (pSomethingColumn != NULL)
if (0 != pSomethingColumn)
if (pSomethingColumn != 0)
if (pSomethingColumn)

我之所以使用(!pSomethingColumn)是因为我很懒,但(pSomethingColumn==NULL)更具表现力,因为它表明变量是指针。

称我为偏心人,但实际上我更喜欢每组中的一个。如果我要做一些特别需要指针存在的事情,我会使用
if(ptr)
。如果我要做一些特别要求指针为NULL的事情,我会使用
if(NULL==ptr)
。我猜这源于这样一种理论,即不否定的陈述更容易阅读


如果(!(0!=!ptr))
你可能会找到支持其中任何一种观点的热烈争论的链接,但唯一的答案是:这不重要。两者都是正确的,根据你的表达标准,两者都可以被认为比另一个稍微更具表达力

关于空指针:虽然空指针的表示依赖于实现,不一定是零值,但空指针常量是值为零的整数常量。所以
NULL
必须定义为可转换为零值整数值的东西-最明显的定义是
0

我一直喜欢

  if (pSomethingColumn != NULL)

不仅因为它在原则上&概念上是正确的,还因为它是自我记录的。使用一个特定的构造,仅仅因为它是有效的,是一个不可移植性的必然配方。在任何符合C++编译器中,

<代码> null <代码>必须等于<代码> 0代码>代码。就我个人而言,我更喜欢使用
NULL
,因为它更明确,意图更明确。但是Bjarne Stroustrup而不是
NULL
,因为他更喜欢避免使用宏。C++ 0x将有一个明确的<代码> null ptr> /c>关键字,希望它能够一次性消除这个问题。< / P>我确信,在任何符合编译器的情况下,代码> null //>必须是0。@ Hamish Grubijan:C++标准4.10:“空指针常量是整数常量表达式(5.19),它的整数类型为0。”和18.1“宏NULL是一个实现定义的C++空指针常数”。同一页上的注脚表明,<代码> 0 < /代码>和<>代码> 0L>代码>对于<代码> null <代码>有效,但不是<代码>(空洞*)0 < /C> > 18.1/4:“宏NULL是在这个国际标准(4.10)中实现的C++空指针常数。但是,4.10规定“空指针常量是一个整数类型的整数常量表达式(5.19)右值,其计算结果为零。空指针常量可以转换为指针类型;结果是该类型的空指针值…”因此0表示空,但当它这样做时,它不一定是按位0。我觉得有必要指出,
nullptr
只是另一个空指针常量