c++ 中 if(pointer) 与 if(pointer != NULL) 的区别,cpplint 问题
difference between if(pointer) vs if(pointer != NULL) in c++, cpplint issue
我已经在网上查看了这个 post Can I use if (pointer) instead of if (pointer != NULL)? 和其他一些 post。
但这并没有说明两种说法之间有什么区别。
问题: 当我在我的 cpp 代码中 运行 cpplint.py 时,我发现检查指针是否为 NULL 的问题。
我更喜欢使用简单的
来检查
if(pointer) //statement1
但是 cpplint 说你应该检查
if(pointer != NULL) //statement2
所以我只想知道,statement2 比 statement1 有什么好处吗?在某些情况下 statement1 可能会产生问题吗?
Working: As per my knowledge there is no difference in working of both statements. Its just a change of coding style.
I prefer to use like statement1, because
- Its Simple, Readable
- No Tension of missing (
=
) by mistake over equality(==
) in a comparison
但 cpplint 将此作为问题提出,那么可能会有一些我错过的好处。
注: Java也不支持statement1.
不,如果pointer
真的是一个指针类型就没有区别,所以这里的一切都是编码风格的问题。编码风格又取决于不同社区的习惯,因此无法给出一般性建议。
我个人更喜欢第一个,因为它更短、更切题并且避免了使用伪造的宏NULL
。
在 C 中 NULL
可以是非常不同的东西(整数或指针),在 C++ 中它的使用现在甚至被弃用了。你至少应该在那里使用 nullptr
。
您使用的是匈牙利表示法,可以判断变量是否为指针。只要它是本地的或智能的,就没有区别。但是,当有人将其更改为另一种间接类型(例如 std::optional<>
)时,second 将失败。所以我的建议是继续使用第一个:它不是 Java,它是 C++。
在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
嗯,[ site ] 说 cpplint
是 :
An automated checker to make sure a C++ file follows Google's C++ style guide
所以再说一次,重要的是某人的风格。假设,如果您在 google 中为某人的代码做出贡献,他们希望您遵循这种有助于轻松协作的风格。
if(pointer) 和 if(pointer != NULL) 没有区别。 if(pointer) 用于代码优化。
在 C++ 中,假设 ptr
是一个指针,比较 if (ptr)
和 if (ptr != NULL)
在功能上是等价的。
在 C++11 及更高版本中,通常认为使用替代方法 if (ptr != nullptr)
更可取。
对于指针的简单检查,这些选项的差异确实是风格上的。机制可能略有不同,但最终结果是一样的。
cpplint 与大多数自动检查器一样,默认情况下倾向于更多地抱怨违反某些样式指南的情况。任何特定的指南集是对还是错取决于您的项目需要什么。
对于可以与指针进行比较的 class 类型(例如智能指针类型),首选测试取决于该类型支持的操作集(比较运算符、隐式转换等)。
有一种情况可能会使用 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,可能会鼓励您遵循他们的编码风格,以保持他们之前学到的教训。
我已经在网上查看了这个 post Can I use if (pointer) instead of if (pointer != NULL)? 和其他一些 post。
但这并没有说明两种说法之间有什么区别。
问题: 当我在我的 cpp 代码中 运行 cpplint.py 时,我发现检查指针是否为 NULL 的问题。 我更喜欢使用简单的
来检查if(pointer) //statement1
但是 cpplint 说你应该检查
if(pointer != NULL) //statement2
所以我只想知道,statement2 比 statement1 有什么好处吗?在某些情况下 statement1 可能会产生问题吗?
Working: As per my knowledge there is no difference in working of both statements. Its just a change of coding style.
I prefer to use like statement1, because
- Its Simple, Readable
- No Tension of missing (
=
) by mistake over equality(==
) in a comparison
但 cpplint 将此作为问题提出,那么可能会有一些我错过的好处。
注: Java也不支持statement1.
不,如果pointer
真的是一个指针类型就没有区别,所以这里的一切都是编码风格的问题。编码风格又取决于不同社区的习惯,因此无法给出一般性建议。
我个人更喜欢第一个,因为它更短、更切题并且避免了使用伪造的宏NULL
。
在 C 中 NULL
可以是非常不同的东西(整数或指针),在 C++ 中它的使用现在甚至被弃用了。你至少应该在那里使用 nullptr
。
您使用的是匈牙利表示法,可以判断变量是否为指针。只要它是本地的或智能的,就没有区别。但是,当有人将其更改为另一种间接类型(例如 std::optional<>
)时,second 将失败。所以我的建议是继续使用第一个:它不是 Java,它是 C++。
在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
嗯,[ site ] 说 cpplint
是 :
An automated checker to make sure a C++ file follows Google's C++ style guide
所以再说一次,重要的是某人的风格。假设,如果您在 google 中为某人的代码做出贡献,他们希望您遵循这种有助于轻松协作的风格。
if(pointer) 和 if(pointer != NULL) 没有区别。 if(pointer) 用于代码优化。
在 C++ 中,假设 ptr
是一个指针,比较 if (ptr)
和 if (ptr != NULL)
在功能上是等价的。
在 C++11 及更高版本中,通常认为使用替代方法 if (ptr != nullptr)
更可取。
对于指针的简单检查,这些选项的差异确实是风格上的。机制可能略有不同,但最终结果是一样的。
cpplint 与大多数自动检查器一样,默认情况下倾向于更多地抱怨违反某些样式指南的情况。任何特定的指南集是对还是错取决于您的项目需要什么。
对于可以与指针进行比较的 class 类型(例如智能指针类型),首选测试取决于该类型支持的操作集(比较运算符、隐式转换等)。
有一种情况可能会使用 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,可能会鼓励您遵循他们的编码风格,以保持他们之前学到的教训。