我可以使用if(指针)而不是if(指针!= NULL)吗?

dan*_*jar 164 c++ null pointers if-statement null-pointer

检查指针是不是NULL通过简单写入if(pointer)或我必须使用它是否安全if(pointer != NULL)

Jon*_*oni 183

您可以; 空指针被隐式转换为布尔值false,而非空指针转换为true.从C++ 11标准,有关布尔转换的部分:

算术,无范围枚举,指针或指向成员类型的指针的prvalue可以转换为类型的prvalue bool.将零值,空指针值或空成员指针值转换为 false; 任何其他值都转换为 true .类型 std::nullptr_t 的prvalue可以转换为类型的prvalue bool ; 结果值是 false .


bil*_*llz 40

是的,你可以.

  • 空指针隐式转换为false
  • 非空指针转换为true.

这是C++标准转换的一部分,它属于布尔转换子句:

§4.12布尔转换

算术,无范围枚举,指针或指向成员类型的指针的prvalue可以转换为bool类型的prvalue.零值,空指针值或空成员指针值转换为false; 任何其他值都转换为true.类型为std :: nullptr_t的prvalue可以转换为bool类型的prvalue; 结果值为false.


Yu *_*Hao 29

是的你可以.事实上,我更喜欢使用,if(pointer)因为一旦你习惯它,它就更容易读写.

还要注意引入的C++ 11 nullptr优先于NULL.

  • 我同意这仅仅是编码风格的问题.我更喜欢`if(指针)`我自己,但是`if(ptr!= nullptr)`对我来说似乎是完全合法的.另一方面,如果我看到我的团队中有人写了"if(some_integer)",我会让他们把它改成`if(some_integer!= 0)`.但是,我不会假装对我来说这不是一个相对随意的偏好 - 我只是不想对指针和整数进行相同处理. (13认同)
  • 指针不是布尔表达式.它是隐式转换的.如果你必须记住这个转换,那么最好先阅读以理解你的意见.它只是一种编码风格. (10认同)
  • @harper你可以说这是一种编码风格.但你可以将相同的逻辑应用于`if(som_integer)`vs`if(some_integer!= 0)`因为整数也不是布尔值,对吧?我更喜欢在if语句中避免使用"0"或"NULL". (7认同)
  • @ franji1那么`if(isReady)``if(filePtr)``if(serviceNo)`怎么样?在这种情况下,故意制造错误的变量名称并不意味着什么.无论如何,我已经明白了你的观点并理解了它,但我自己也坚持使用自己的编码风格,好吗? (4认同)
  • @YuHao - 我只是想故意混淆类型以强调我的观点。我决定生成一个“答案”来更好地表达我的观点。(遗憾的是,我倾向于使用两种样式编写代码,但在进行维护时倾向于看到扩展版本,但倾向于更喜欢创建它时使用的较短版本)。 (2认同)

Gri*_*han 12

问题已得到解答,但我想补充一点.

我会永远喜欢if(pointer)的,而不是if(pointer != NULL)if(!pointer)替代if(pointer == NULL):

  • 它很简单,很小
  • 机会少写了一个bug的代码,想如果我拼错平等检查操作===
    if(pointer == NULL)可拼错if(pointer = NULL)所以我会避开它,最好是只if(pointer).
    (我也在一个答案中提出了一些尤达条件,但这是不同的事情)

  • 同样地while (node != NULL && node->data == key),我会简单地写while (node && node->data == key)一下对我来说更明显(表明使用短路).

  • (可能是愚蠢的原因)因为NULL是一个宏,如果假设有人用其他值重新定义错误.

  • 使用=而不是==几乎总是生成编译器警告,在人们没有使用if的时候(NULL == ptr) (6认同)
  • @paulm 我刚刚添加了这一点,它称为 [Yoda Condition](http://en.wikipedia.org/wiki/Yoda_Conditions) 有些人不喜欢它,因为它的可读性较差。 (2认同)
  • `(布尔表达式)?true:false`完全没有意义.表达式评估为"true"或"false"; 你说的是"如果它是真的,请给我真实,如果它是假的,给我假".简而言之:它完全等同于布尔表达式本身.请注意,`node == NULL`是一个布尔表达式.顺便说一句,你的两个实现完全相反.你要么在第一个中想要`!=`,要么在第二个中只想要一个`!`. (2认同)
  • 因为智能指针类具有“ T * get()const”而不是“ operator T *()const”,以避免隐式转换。但是它们确实有一个“ operator bool()const”。 (2认同)

Min*_*Pan 10

显式检查NULL可以为编译器提供关于您尝试执行的操作的提示,从而减少错误.

在此输入图像描述


das*_*ght 8

是的你可以.隐式地将值与零进行比较的能力是从C继承的,并且在所有版本的C++中都存在.您还可以使用if (!pointer)检查NULL的指针.