2017-09-28 19 views
0

私は現在、「Programming:Principles and Practice using C++」の第17章にあり、二重リンクリストのコードを発見しました。これまでにこのコードセットについて質問がありましたが(たとえばMember access in a doubly-linked list)、質問/回答されていない質問があります。ポインタと二重リンクリスト

コードは基本的に "Odin"の前身として "Freya"を配置し、 "Odor"を "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 }、およびトールオーディンの後継作りますnorse_godはすでに新しいアドレスを指しているはずです:new Link{ "Odin", nullptr, norse_gods }?私が逃している注文や評価やコンセプトはありますか?

+1

コンストラクタにパラメータとして 'norse_gods'を渡して、' return 'の値を使って 'norse_gods'に代入します(以前に保持されていた変数の値を置き換えます)。 – UnholySheep

+0

' x = x +左側の「x」は「新しい値」で、右側の「x」は「古い値」 – anatolyg

+0

このコードのフォーマットは誤解を招くことがあります。オーディンをリストに追加することは、新しいリンク{"Odin"、..}とnorse_gods-> succ-> prev = norse_gods; Freyaの場合も同様です。したがって、空白行が必要な場合は、それらの真ん中ではなく、これらの文のグループの前にそれらを置くことは論理的です。 –

答えて

4

評価はまず右側で行われ、次にoperator=がキックインされ、割り当てが行われます。これは、優先度がoperator=であるために発生します。 C++ Operator Precedenceを参照してください。

mainの最初の行には、という名前のという名前のLinkが作成されます。

2行目には、 "Odin"という名前の後継者norse_godというLinkが作成されていますが、それはまだ建設の時点でThorを指しています。

その後、norse_godsが「Odin」を指すように更新されます。

このような現象は、Cのような言語では正常です。

2

最初に右側の式が評価されます。これは、古い値のnorse_godsを評価します。この評価が完了すると、割り当てが完了し、新しく作成されたオブジェクトへの参照がnorse_godsに割り当てられます。

+3

rvalueは、演算子のどちら側=式が接続されているものと接続されていません。右辺値についての説明はここでは不適切です。 –

+0

ここには値がありません。 –