【问题标题】:what is the best way to interpret the following return statement in data structure?在数据结构中解释以下 return 语句的最佳方法是什么?
【发布时间】:2014-10-05 08:40:41
【问题描述】:

(p->prev = p->prev->next = new Node{x, p->prev, p}) 是 C++ 代码 sn-p 中的返回语句。它用于在列表中插入新节点。我不太明白这里的一个语句中怎么会有两个相等的运算符。

【问题讨论】:

  • 至少这不是 C.
  • 这也与 operator 关键字无关。
  • 什么是iteratorprevnextNode?除了人们之外,你到底怎么回答这个问题? C ?
  • 写这段代码的人必须被打脸。很难。
  • 请看下面的讨论

标签: c data-structures


【解决方案1】:

看起来像

  • 这是一个双向链表。
  • iterator 是一个类。
  • Node 也是一个类。
  • x 是要插入的值。
  • Node 是一个聚合,具有三个数据成员,顺序为 valueprevnext,或者具有一个按此顺序采用三个参数的构造函数。
  • p 是指向 Node 的指针,新节点应该在它之前。

基于这些假设:

  • new Node{ x, p->prev, p }new创建一个新节点,将其值设置为x,其上一个节点为p->prev,其下一个节点为p。它返回一个指向这个新节点的指针。
  • p->prev->next = /*...*/ 设置 nextp->prev - 即之前在 p 之前的节点 - 指向这个新创建的节点。此表达式的值是分配的值(正式地,它是一个引用 p->prev->next 的左值,然后转换为右值,即读取存储的值),它是指向新节点的指针。
  • p->prev = /* ... */ 最终使p->prev 也指向这个新节点。这个表达式的结果又是指向新节点的指针。最终结果是在p之前插入了新节点。
  • 最后,iterator(/* ... */) 构造一个指向新节点的迭代器,return 将其返回给调用者。

不应使用这样的代码。它可能看起来“可爱”,但很难阅读和理解,当我阅读它时,我的第一反应是“你确定这不是未定义的行为”?我花了一些时间来说服自己该行为是明确定义的(至少在 C++11 中)。

【讨论】:

  • 抱歉让您感到困惑。这是来自c中数据结构的课程笔记。我没有注意到用 C++ 编写源代码的起源。将修改搜索键。除了新Node x的插入,看来我们为什么不定义prev->p
猜你喜欢
  • 2016-04-23
  • 1970-01-01
  • 2019-05-29
  • 2015-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多