if(pointerVar)是否与if(pointerVar!= NULL)相同?

Ale*_*rty 6 c++ pointers

简单的问题:

if (pointerVar)一样的if (pointerVar!=NULL)吗?

还有,是if (!pointerVar)一样的if (pointerVar==NULL)吗?

给我你最技术上正确/迂腐的答案.这两个陈述似乎也是有意义的.前者是否有任何问题(除了可读性略低)?

tem*_*def 10

对于最迂腐的答案,这里是规范的相关部分.

首先,这是if语句如何工作,来自§6.4.4:

除switch语句之外的语句中初始化声明的条件值是隐式转换为typebool的声明变量的值.如果转换形式不正确,该程序就会形成错误.

"但是如何将指针转换为bools?" 你可能会问.好吧,这是§4.12.1::-)

算术,枚举,指针或指向成员类型的指针的右值可以转换为bool类型的右值.零值,空指针值或空成员指针值转换为false; 任何其他值都转换为true.

所以这意味着声明

if (ptr)
Run Code Online (Sandbox Code Playgroud)

相当于

if ((bool) ptr)
Run Code Online (Sandbox Code Playgroud)

这相当于

if (ptr == NULL)
Run Code Online (Sandbox Code Playgroud)

但是关于

if (!ptr)
Run Code Online (Sandbox Code Playgroud)

那么,C++规范§5.3.1.8就是这么说的

逻辑否定运算符的操作数!被隐式转换为bool(第4条); true如果转换的操作数是false,false则其值为.结果的类型是bool.

所以这意味着

if (!ptr)
Run Code Online (Sandbox Code Playgroud)

相当于

if (!(bool)ptr)
Run Code Online (Sandbox Code Playgroud)

这相当于

if (!(ptr == NULL))
Run Code Online (Sandbox Code Playgroud)

这最终相当于

if (ptr != NULL)
Run Code Online (Sandbox Code Playgroud)

呼!这是一个有趣的搜索.希望这能回答你的问题!

当然,这个故事还有更多. NULL不是C++语言的一部分; 这是一个<cstddef>定义为的宏

#define NULL 0
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为C++标准将§4.10.1中的空指针定义为

空指针常量是整数类型整数常量表达式(5.19)rvalue,其值为零.空指针常量可以转换为指针类型; 结果是该类型的空指针值,并且可以与指向对象的指针或指向函数类型的指针的每个其他值区分开来

所以更正确一点,我应该在上面的例子中使用数字文字0.但是,如果已<cstddef>包含,那么在预处理之后这将使用相同的代码.


Mar*_*tos 6

假设pointerVar是一个原始指针,那么是.否则,它取决于,但通常智能指针实际上仍然是相同的.

第一个版本肯定没有任何问题,事实上,许多有经验的C++程序员会认为它更具可读性.