C ++中的空指针

时间:2010-11-26 16:49:39

标签: c++

大家,我对C ++有一些疑问,你实际上更喜欢使用什么

int* var = 0;

if(!var)...//1)
or
if(var == 0)..//2)

有什么优点和缺点?提前谢谢

8 个答案:

答案 0 :(得分:9)

我更喜欢if (!var),因为您不会意外地分配到var,而且您不必在0NULL之间进行选择。

答案 1 :(得分:5)

我一直被教导使用if (!var),似乎我读过的所有惯用的C(++)都遵循这一点。这有一些很好的语义:

  • 没有意外分配
  • 你正在测试某事物的存在(即如果它是NULL)。因此,您可以将语句读作“如果var不存在”或“如果未设置var”
  • 如果var是布尔值,则会严格地映射你惯用的内容(在C中没有bool,但人们仍然模仿它们的使用)
  • 与前一点类似,它与谓词函数调用紧密相关,即。 if (!isEmpty(nodeptr)) { .. }

答案 2 :(得分:2)

主要是个人偏好。有人会建议第一个是首选,因为不可能意外分配而不是比较。但同样的道理,如果你养成了将rvalue放在比较左边的习惯,编译器会在你吹掉它时抓住你:

if( 0 == var )

......这当然是对的。我只是觉得if( !var )更具表现力,而且打字更少。

他们都会评估相同,所以没有运行时差异。最重要的是你选择一个并且坚持下去。不要将其中一种混合使用。

答案 3 :(得分:1)

任何一个都是好的,虽然我个人更喜欢2 - 或类似的东西。

让我更有意义阅读:

if ( ptr != NULL )

大于

if ( ptr )

第二个我可能会因为只是一个布尔值而感到困惑,但第一个我能够立刻告诉它它是一个指针。

无论哪种方式,我认为选择一个并坚持这一点以保持一致性非常重要 - 而不是在整个产品中以不同的方式完成它。

答案 4 :(得分:1)

几年过去了......

C ++ 11标准引入nullptr来检查空指针,应该使用它,因为它确保比较实际上是在指针上完成的。 因此,最强大的检查将是:

if(myPtr != nullptr)

!var的问题在于,如果var是布尔值或数值(int,byte等......),它将测试它们是否等于0。 如果您使用nullptr,则可以确定您正在检查的指针不是任何其他类型:

例如:

int valA = 0;
int *ptrA = &valA;

if(!valA) // No compile error
if(!*ptrA) // No compile error
if(!ptrA) // No compile error

if(valA != nullptr) // Compile error, valA is not a pointer
if(*ptrA != nullptr) // Compile error, *ptrA is not a pointer
if(ptrA != nullptr) // No compile error

因此,在示例中操作指向int的指针时很容易出错,这就是为什么应该使用nullptr

答案 5 :(得分:0)

我更喜欢选项3:

if(not var)
{
}

C ++的新(自1998年以来)运算符关键字可以使代码更容易阅读。

奇怪的是,他们似乎很不为人知。似乎有更多的人知道什么是三字母(谢谢IOCCC!),而不是那些知道运算符关键字的人。运算符关键字存在类似的原因:即使键盘不提供所有ANSII字符,它们也允许使用C ++编程。但与trigraphs相反,运算符关键字使代码更具可读性而不是混淆代码。

答案 6 :(得分:0)

根据高完整性C ++编码标准手册:用于常量和变量之间的比较,您应该将常量放在左侧以防止赋值而不是相等比较,例如:

Avoid:
if(var == 10) {...}

Prefer
if(10 == var) {...}

特别是在你的情况下,我更喜欢if(0 == var),因为很明显你将指针比较为null(0)。因为!运算符可以重载然后它可能有其他含义,具体取决于指针指向的内容: if(!(* var)){...}

答案 7 :(得分:0)

  1. DON' T使用NULL,使用0。
  2. 严格来说,指针不是bool,所以请使用' =='和'!='运算符。
  3. 永远不要使用'如果(ptr == 0)',请使用' if(0 == ptr)'代替。
  4. 不要使用C指针,而是使用smart_ptr。 : - )