NULL == 指针 [重复]
Posted
技术标签:
【中文标题】NULL == 指针 [重复]【英文标题】:NULL == pointer [duplicate] 【发布时间】:2013-07-21 12:40:36 【问题描述】:在C++中,我们通常检查一个指针是否为空,我只知道我们应该使用
if(NULL == ptr)
代替:
if(ptr == NULL)
我想知道为什么?
另外,如果我们想将一个ptr初始化为null,我们应该使用ptr = NULL
还是ptr = 0
?是的,我知道在 C++ 中,我们通常使用ptr = nullptr
,我想知道我们为什么要这样做只是为了统一代码?谢谢
【问题讨论】:
我通常写if (!ptr)
。它更短,冗余更少。
我在这里有点困惑,您的问题是为什么不能使用NULL==ptr
而不是ptr==NULL
,还是您的问题是为什么不能使用=
而不是@987654331 @ ?
我问了两个问题
它被称为Yoda Condition
【参考方案1】:
这是一种编码风格(命名为 Yoda Conditions),以避免在 if 语句中使用 =
而不是 ==
,在 if 语句中使用赋值 =
是有效的,但它通常不是你想要的想要。
就我个人而言,我不喜欢这样使用,因为它很难阅读,而且当你在 if 语句中使用 =
时,现代编译器会警告你。
还要注意:
if(ptr == NULL)
与 if(!ptr)
相同。
C++11 引入了nullptr
来替换使用NULL
。所以要初始化一个空指针,最好使用ptr = nullptr
关于为什么使用nullptr
而不是NULL
:
在 C++11 之前,NULL
通常在内部实现为#define NULL 0
,但问题是,0
也是整数零。在某些情况下可能会引起麻烦。例如:
void func(int n);
void func(char *s);
func(NULL); //call which function?
虽然作者暗示NULL
是指针类型,但编译器只知道调用func(0)
。所以第一个版本会被调用。
使用func(nullptr)
,编译器会知道它是一个指针并调用第二个版本。
【讨论】:
+1,但我要指出,问题是=
即使在条件句中也是 assignment - 这常常让初学者感到困惑。在此答案中始终假定这一点,但从未明确说明。
这是nullptr
,而不是null_ptr
。
是的,在我的第二个问题中,我知道我们应该使用 nullptr,我想知道为什么?只想统一代码风格?
@minicaptain 你的意思是你不明白为什么使用nullptr
而不是NULL
或者为什么要初始化一个指向空指针的指针?
我想知道为什么要使用nullptr ove null,谢谢!【参考方案2】:
使用 yoda 相等可以防止某些错误,例如使用单个 =
或编译器尝试从智能指针确定整数。
已经知道了
我花了两天时间追查这个错误,因为他们认为 yoda 是个坏主意。
【讨论】:
以上是关于NULL == 指针 [重复]的主要内容,如果未能解决你的问题,请参考以下文章
在 NULL 指针上调用 delete 或 delete[] [重复]