我目前在“编程:使用C ++的原理和实践”的第17章,并且遇到了双向链表上的代码。之前曾有人问过这组代码的问题(例如Member access in a doubly-linked list),但是我没有被问到/回答过的问题。
该代码基本上将“ Freya”安排为“ Odin”的前身,并使“ Odin”成为“ Thor”的前身,反之亦然。代码如下:
struct Link {
string value;
Link* prev;
Link* succ;
Link(const string& v, Link* p = nullptr, Link* s = nullptr)
: value(v), prev(p), succ(s) {}
};
int main()
{
Link* norse_gods = new Link{ "Thor", nullptr, nullptr };
norse_gods = new Link{ "Odin", nullptr, norse_gods };
norse_gods->succ->prev = norse_gods;
norse_gods = new Link{ "Freya", nullptr, norse_gods };
norse_gods->succ->prev = norse_gods;
}
我想知道的是为什么代码:
norse_gods = new Link{ "Odin", nullptr, norse_gods }
能够指向旧地址
new Link{ "Thor", nullptr, nullptr }
,并使Thor成为Odin的继任者,因为norse_god
应该已经指向新地址:new Link{ "Odin", nullptr, norse_gods }
?我缺少一些命令,评估或概念吗? 最佳答案
首先在右侧进行评估,然后加入operator=
并进行分配。这是由operator=
的优先级引起的。请参见C++ Operator Precedence。
在main
的第一行,您将创建一个名称为“ Thor”的Link
,并将norse_gods
指向它。
在第二行中,您将创建一个名为“ Odin”和后继者Link
的norse_god
,在构建时它仍指向Thor。
之后,norse_gods
被更新为指向“ Odin”。
对于类似C的语言,此行为是正常的。
关于c++ - 指针和双向链表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46472051/