我已经在网上查看了这篇文章Can I use if (pointer) instead of if (pointer != NULL)?和其他一些帖子。
但它并没有说明两个陈述之间有任何区别。
问题:当我在cpp代码上运行cpplint.py时,我发现了检查NULL指针的问题。 我更喜欢使用简单的
进行检查if(pointer) //statement1
但 cpplint 表示你应该检查
if(pointer != NULL) //statement2
所以我只是想知道, statement2 对 statement1 有什么好处吗?是否存在 statement1 可能会产生问题的情况?
工作:据我所知,这两个陈述的工作没有区别。它只是改变了编码风格。
我更喜欢使用 statement1 ,因为
- 简单易读
- 在比较中错误地忽略了(
=
)没有张力(==
)
但是cpplint正在提出这个问题,然后可能会有一些我错过的好处。
注意: Java也不支持 statement1 。
答案 0 :(得分:6)
不,如果pointer
实际上是指针类型没有区别,那么这里的所有内容都是编码风格的问题。编码风格又取决于不同社区的习惯,因此无法提出一般性建议。
我个人更喜欢第一个,因为它更短,更重要,避免使用虚假宏NULL
。
在C NULL
中可能是非常不同的东西(整数或指针),而在C ++中,它的使用现在甚至已被弃用。你至少应该使用nullptr
。
答案 1 :(得分:3)
您正在使用匈牙利表示法,可以判断变量是否为指针。只要它 - 无论是原生的还是聪明的 - 都没有区别。但是,当有人将其更改为其他间接类型(例如std::optional<>
)时, second 将失败。所以我的建议是继续使用第一个:它不是Java,它是C ++。
答案 2 :(得分:2)
在C ++中,假设ptr
是指针,比较if (ptr)
和if (ptr != NULL)
在功能上是等效的。
在C ++ 11及更高版本中,通常认为最好使用替代if (ptr != nullptr)
。
对于指针的简单检查,这些选项的差异非常具有风格。机制可能略有不同,但最终结果是相同的。
像大多数自动化检查器一样,cpplint倾向于 - 默认情况下 - 更多地抱怨违反某些风格指南的行为。是否有任何特定的指导方针是对还是错,取决于您的项目需要什么。对于可以明智地与指针进行比较的类类型(例如智能指针类型),首选测试取决于类型支持的操作集(比较运算符,隐式转换等)。
答案 3 :(得分:1)
在C
,onsider:
int *ptr=malloc(10*sizeof *ptr);
free(ptr); // though the memory is freed, the ptr is not auto-set to NULL
if (ptr)
{
printf ("ptr is not null\n");
}
所以你应该放
ptr=NULL; // ptr is explicitly made to point at nothing
// The above step is mandatory.
在free
之后。
所以作为if-statement
中的回复,可能会建议做
if ( ptr == NULL ) // This is mostly a coding style & improves readability?
或更好
if ( NULL == ptr ) // less chances of error
好吧,[ site ]说的是cpplint
:
一个自动检查器,用于确保C ++文件符合 Google的C ++风格指南
再说一遍,重要的是某人的风格。比方说,如果你在google中为某些人的代码做出贡献,他们希望你能够遵循这种方式来促进轻松协作。
答案 4 :(得分:0)
在一种情况下,使用 statement1 可能会引起问题。
考虑以下代码,它们可能具有两种不同的含义。
bool* is_done = ...;
// Is this checking if `is_done` is not null, or actually
// intended to check if `*is_done` is true?
if (is_done) {
...
}
如果您打算进行空检查,则可以。但是,如果您的原始意图是检查*is_done
是否为真,但偶然遗漏了一个星号,则此代码可能会导致完全不受欢迎的行为,并且需要您花费X个小时来找出罪魁祸首。
可以通过显式检查如下语句来避免这种情况
// Now this results in a compile error and forces you to write
// `*is_done` instead.
if (is_done == true) {
...
}
这适用于任何可以隐式转换为bool
的类型,例如std :: unique_ptr。
有人可能会争辩说上述情况太少了,仍然倾向于statement1
以便于简化。我认为这很公平,两种风格都可以接受。但是,某些组织(例如Google)可能会鼓励您遵循他们的编码风格,以保持先前学习的经验。
答案 5 :(得分:-1)
if(指针)和if(指针!= NULL)之间没有区别。 if(指针)用于代码优化。