C++ - “!pointer”和“pointer == nullptr”之间的区别?

Posted

技术标签:

【中文标题】C++ - “!pointer”和“pointer == nullptr”之间的区别?【英文标题】:C++ - Difference between "!pointer" and "pointer == nullptr"? 【发布时间】:2020-02-23 17:53:10 【问题描述】:

所以我从一个函数中发现了这个小sn-p代码

void remove(Node * & p, const int & key)
  if(!p)
    throw out_of_range("The key you're looking for can't be found\n");
  
  if(p == nullptr)
    return;
  

我不太明白!pp == nullptr 之间的区别。从我读过的关于 C++ 的内容来看,这两个陈述似乎总是等价的。他们不是吗?我错了吗?

需要澄清一下。

谢谢!

【问题讨论】:

有趣的问题在上下文中,因为代码中的p 是对指针的引用。这有什么不同吗? 代码 sn-p 中的第一个和第二个if 之间真的没有任何东西吗? @t.niese 不,没什么。 它们是一样的。不要在没有放置逻辑的地方寻找逻辑。 【参考方案1】:

其实两者都是一样的。您可以使用两者来检查指针是否为空。

nullptr 是在 C++11 中引入的,它可以像 if(p == nullptr) 一样使用,它优于 if(!p)

希望这会有所帮助:)

【讨论】:

好的,谢谢!每个人都在说它是一样的。似乎编写该代码的人只是犯了一个错误或更加偏执:) 他们可能会在 MCQ 中问这些类型的问题,例如将执行哪个 if 块;)【参考方案2】:

第一个“if”实际比较的是 p == 0(换句话说 !p)。它是一种 C 的 NULL 桥接到 C++ 中可能会导致重载函数的歧义。 例如: 检查(int)和检查(int*)。

第二个 if 是根据指针类型(nullptr)检查 p

【讨论】:

对不起,但对我来说仍然不是很清楚(我是 C++ 新手)。检查指针是否为空和检查指针类型是否为“nullptr”有什么区别......对我来说听起来一样。【参考方案3】:

首先

两者 100% 相同,相同含义相同工作 开发人员刚刚使用了 2 个 If 语句(第一个显示未找到的消息) 和第二个返回,虽然他可以在 1 中同时做到,但也许他只是想 表明他知道这两种方法这就是他这样做的原因否则没有 两者的差异,并且可能需要多花一点时间。 -为了更清晰的视图,您可以访问此链接 (difference between p == NULL and !p in c++)

详细答案如下:

!p 和 p==nullptr 都具有相同的工作 您案例中的代码显示, if(!p) 和 if(p==nullptr) 都只是用来表明开发人员知道两种方法,并且他是熟悉旧版本 C++ 的高级开发人员 因为如果他使用

if(!p)throw out_of_range("The key you're looking for can't be found\n");
return;

or Uses
if(p==nullptr)
throw out_of_range("The key you're looking for can't be found\n");
return;

但在你的情况下,唯一的开发者做了他 显示在第一个 IF 中找不到节点的消息 并在第二个 If 中返回函数。无论他的想法或意图是什么,但两者都是相同的,它只是使用了另一个根本不需要的 IF

如果您仍然需要有关两者之间的详细区别的更多帮助,您可以查看difference between p == NULL and !p in c++

【讨论】:

以上是关于C++ - “!pointer”和“pointer == nullptr”之间的区别?的主要内容,如果未能解决你的问题,请参考以下文章

“C++ void Pointer”和“C# var”之间的区别

什么是C ++中Reference和Pointer返回类型之间的区别

Qt4 C++ Pointer to const QList of pointers

使用基于 WM_POINTER 的触摸进行两指平移

[c++]dynamic_pointer_cast用于shared_ptr之间类型的转换,基类需要有虚函数

调试断言失败!表达式:result_pointer!=nullptr