11

我已经检查了这篇文章我可以使用 if (pointer) 而不是 if (pointer != NULL) 吗?以及网上的一些其他帖子。

但这并没有说明两个陈述之间的任何区别。

问题:当我在我的 cpp 代码上运行 cpplint.py 时,我发现了检查指针是否为 NULL 的问题。我更喜欢使用简单的检查

if(pointer)         //statement1

但是cpplint说你应该检查一下

if(pointer != NULL)        //statement2

所以我只想知道,statement2statement1有什么好处吗?在某些情况下statement1可能会产生问题吗?

工作:据我所知,两种语句的工作没有区别。它只是编码风格的改变。

我更喜欢使用 like statement1,因为

  • 它简单易读
  • =在比较中没有错失( )而不是相等(==)的张力

但是 cpplint 将此作为问题提出,那么我可能会错过一些好处。

注意: Java 也不支持statement1

4

6 回答 6

6

不,如果pointer真的是指针类型没有区别,所以这里的一切都是编码风格的问题。编码风格又取决于不同社区的习惯,因此无法给出一般性推荐。

我个人更喜欢第一个,因为它更短,更中肯,并且避免了使用虚假宏NULL

在 CNULL中可以是非常不同的东西(整数或指针),而在 C++ 中,它的使用现在甚至已被弃用。你至少应该在nullptr那里使用 , 。

于 2016-07-31T10:05:31.040 回答
3

在 C++ 中,假设ptr是一个指针,比较if (ptr)if (ptr != NULL)在功能上是等价的。

在 C++11 及更高版本中,通常认为最好使用替代if (ptr != nullptr).

对于指针的简单检查,这些选项的差异确实是风格上的。机制可能略有不同,但最终结果是相同的。

与大多数自动检查器一样,cpplint 倾向于 - 默认情况下 - 比其他人更多地抱怨违反某些样式指南。任何特定的指导方针是对还是错取决于您的项目需要什么。

对于可以与指针进行合理比较的类类型(例如智能指针类型),首选测试取决于该类型支持的操作集(比较运算符、隐式转换等)。

于 2016-07-31T13:43:57.337 回答
3

您正在使用匈牙利表示法,可以判断变量是否为指针。只要它是 - 无论是原生的还是智能的 - 都没有区别。但是,当有人将其更改为另一种间接类型(例如,std::optional<>)时,第二个将失败。所以我的建议是继续使用第一个:它不是 Java,它是 C++。

于 2016-07-31T10:07:40.493 回答
1

C, 旁观者 :

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

好吧,[网站]说它cpplint是:

用于确保 C++ 文件遵循Google 的 C++ 样式指南的自动检查器

再说一次,重要的是某人的风格。比如说,如果您在 google 中为某人的代码做出贡献,他们希望您遵循这种有助于轻松协作的风格。

于 2016-07-31T10:17:36.230 回答
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) {
  ...
}

这适用于任何可以隐式转换为boolstd::unique_ptr 的类型。

有人可能会争辩说,上述情况太少见了,仍然倾向于statement1简单。我认为这是公平的,两种风格都可以接受。但是一些组织,比如谷歌,可能会鼓励你遵循他们的编码风格,以保持他们以前学到的教训。

于 2020-03-27T17:36:26.600 回答
-1

if(pointer) 和 if(pointer != NULL) 之间没有区别。if(pointer) 用于代码优化。

于 2016-07-31T10:52:28.240 回答