我目前正在使用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 }
?是否有一些我错过的订单或评估或概念?
答案 0 :(得分:4)
首先在右侧进行评估,然后operator=
开始进行评估。这是由operator=
的优先级引起的。请参阅C++ Operator Precedence。
在main
的第一行,您正在创建一个名为“Thor”的Link
,并将norse_gods
指向它。
在第二行,你创建一个名为“Odin”的Link
和一个继承人norse_god
,它在施工时仍然指向Thor。
之后,norse_gods
更新为指向“Odin”。
这种行为对于类C语言来说是正常的。
答案 1 :(得分:2)
首先评估右侧的表达式。这会评估norse_gods
的旧值。完成此评估后,将完成分配,并将对新创建的对象的引用分配给norse_gods
。