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

时间:2010-08-18 21:24:46

标签: c++ pointers null coding-style

选项A:

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

或者

if (pSomethingColumn)
if (!pSomethingColumn)

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

我听说有些人说技术上NULL不必定义为0,而是来吧!如果是这种情况,那么吸盘(我们的应用程序)会以-2147483648不同的方式崩溃。

所以,如果NULL != 0,那么我们就会遇到大问题。

请帮我解决一个毫无意义的语法辩论。我对这两种方式都不是特别关注;只是寻找官方的方式。感谢。

P.S。我们正在使用Visual Studio C ++编译器。

8 个答案:

答案 0 :(得分:11)

我认为这是历史事故,零对应于假,非零对应于真;我只想为布尔表达式保留这些表单。但是,我在其他人的代码中看到该表单时没有问题。

我的投票:

if (pSomethingColumn == NULL)

不,我从未因忘记其中一个等号而被咬伤。很幸运,或者非常小心。

答案 1 :(得分:9)

两者都没有明显好于另一个。从技术角度来看,它们是等价的。指针上下文中的数字0并不表示所有位为零;它被定义为等效于用于表示空指针的任何位模式。 NULL可以定义为0(void *) 0。这两种定义都是语法上的,并且没有说明基础位表示。

所以if (!p)if (p == NULL)相同,就技术正确性而言,if (p == 0)if (!p)相同。

问题是风格问题。像所有风格问题一样,您的第一个倾向应该是匹配现行的编码标准。与代码库的其余部分做同样的事情。如果没有普遍的标准,那么归结为个人偏好,我们鼓励您与同行一起制定编码标准。

(我个人喜欢使用显式比较并为布尔值保留较短的语法,但我很乐意使用{{1}}这是其他人正在做的事情。)

答案 2 :(得分:3)

在C ++中,NULL必须是每个实现中的空指针常量。 0作为常量表达式始终是空指针常量(即,当转换为指针类型时,它会产生空指针值)。这些都不意味着任何给定指针类型的空指针值必须由零或所有位为零的地址表示,但这主要是从应用程序开发人员的观点来看。

要使用NULL,您应该#include定义它的标题,例如<cstddef>;您可以随时使用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)

答案 3 :(得分:3)

叫我古怪,但我实际上更喜欢每一套。如果我要做一些特别需要指针存在的东西,我会使用if(ptr)。如果我要做一些特别要求指针为NULL的东西,我会使用if(NULL==ptr)。我想这源于这样的理论,即阅读不被否定的陈述更容易。

越多越好...... if(!(0 != !ptr))

答案 4 :(得分:1)

你可能会找到热情的论据的链接,支持任何一个,但唯一的答案是:无所谓。两者都是正确的,根据你的表达标准,两者都可以被认为比另一个更具表现力。

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

答案 5 :(得分:1)

我总是喜欢

  if (pSomethingColumn != NULL)

不仅因为它主要是&amp;在概念上是正确的,但也因为它是自我记录。使用特定的构造只是因为“它的工作原理”是不可移植性的可靠方法。

答案 6 :(得分:1)

在任何符合标准的C ++编译器中,

NULL必须等于0。就个人而言,我更喜欢使用NULL,因为恕我直言,它更明确,意图更清晰。但是Bjarne Stroustrup uses 0而不是NULL,因为他更喜欢避免使用宏。 C ++ 0x将有一个明确的nullptr关键字,希望一劳永逸地消除这个问题。

答案 7 :(得分:0)

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