简单问题:
if (pointerVar)
与if (pointerVar!=NULL)
相同吗?
此外,if (!pointerVar)
与if (pointerVar==NULL)
相同吗?
给我你最技术上正确/迂腐的答案。这两个陈述似乎也是有意义的。前者是否有任何问题(除了可读性略低)?
答案 0 :(得分:10)
对于最迂腐的答案,这是规范的相关部分。
首先,这里是if
语句的工作原理,来自§6.4.4:
在switch语句以外的语句中作为初始化声明的条件的值是声明的变量隐式转换为类型
bool
的值。如果转换结构不合理,该程序就会形成错误。
“但是如何将指针转换为bool
s?”你可能会问。好吧,这是§4.12.1:: - )
算术,枚举,指针的右值或成员类型的指针可以转换为bool类型的右值。零值,空指针值或空成员指针值转换为false;任何其他值都转换为true。
所以这意味着声明
if (ptr)
相当于
if ((bool) ptr)
又相当于
if (ptr == NULL)
但是
呢if (!ptr)
嗯,C ++规范§5.3.1.8说
逻辑否定运算符的操作数!被隐式转换为
bool
(第4条);如果转换后的操作数为true
,则其值为false
,否则为false
。结果的类型为bool
。
所以这意味着
if (!ptr)
相当于
if (!(bool)ptr)
又相当于
if (!(ptr == NULL))
最终相当于
if (ptr != NULL)
呼!这是一个有趣的搜索。希望这能回答你的问题!
当然,这个故事还有更多。 NULL
不是C ++语言的一部分;它是<cstddef>
中定义为
#define NULL 0
这是有效的,因为C ++标准将§4.10.1中的空指针定义为
空指针常量是整数类型的整数常量表达式(5.19)rvalue,其评估为零。空指针常量可以转换为指针类型;结果是该类型的空指针值,并且可以与指向对象或指向函数类型的指针的每个其他值区分开来
所以更正确一点,我应该在上面的例子中使用数字文字0。但是,如果您包含<cstddef>
,那么在预处理后这将用于相同的代码。
答案 1 :(得分:6)
假设pointerVar
是原始指针,那么是。否则,它取决于,但通常它对于智能指针实际上仍然是相同的。
第一个版本肯定没有问题,事实上,许多有经验的C ++程序员会认为它更具可读性。
答案 2 :(得分:1)
在C ++中NULL
扩展为0
或0L
。因此if (pointerVar)
与if (pointerVar!=NULL)
和if (!pointerVar)
相同,与if (pointerVar==NULLL)
相同。
答案 3 :(得分:1)
是。你是对的。请记住,如果条件返回零值,则条件为false,否则为true。在上面的表达式中,当pointerVal = NULL(内部为NULL)时,if(pointerVal)
将返回false。 if(!pointerVal)
的反转是正确的,因为我们正在否定条件
这两种表达方式都是有效且通用的。