2017-09-28 6 views
0

저는 현재 "Programming : Principles and Practice using 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 }, 토르 오딘의 후계자 만들기 norse_god은 이미 새 주소를 가리켜 야하기 때문에 : new Link{ "Odin", nullptr, norse_gods }? 내가 누락 된 순서 또는 평가 또는 개념이 있습니까?

+1

'norse_gods'를 생성자에 매개 변수로 전달한 다음'반환 값 '을 사용하여'norse_gods '에 할당합니다 (이전에 보유한 변수의 값을 대체). – UnholySheep

+0

'x = x + 5'와 마찬가지로, 왼쪽의 'x'는 '새로운 값'이고, 오른쪽의 'x'는 '이전 값'입니다. – anatolyg

+0

사이드 코드는 해당 코드의 형식이 잘못되었음을 나타냅니다. 목록에 Odin을 추가하면 새로운 링크 { "Odin", ..} 및 norse_gods-> succ-> prev = norse_gods; - Freya도 비슷하게. 따라서 공백 라인을 원할 경우, 그 중간에있는 것이 아니라 이러한 문장 그룹 앞에 공백을 두는 것이 논리적 일 것입니다. –

답변

4

먼저 오른쪽에서 평가 한 다음 operator=을 입력하고 과제를 수행합니다. 이는 operator=의 우선 순위 때문에 발생합니다. C++ Operator Precedence을 참조하십시오.

첫 번째 줄의 main에서 으로 이름이 "Thor"인 Link을 만듭니다.

두 번째 줄에서는 Link의 이름이 "Odin"이고 그 후속자인 norse_god이 생성시 Thor를 가리키고 있습니다.

그 후 norse_gods이 "Odin"을 가리 키도록 업데이트됩니다.

이 동작은 C와 유사한 언어의 경우 정상입니다.

2

오른쪽에있는 표현이 먼저 평가됩니다. 이 값은 이전 값인 norse_gods을 사용합니다. 이 평가가 완료되면 할당이 완료되고 새로 생성 된 개체에 대한 참조가 norse_gods에 할당됩니다.

+3

rvalue는 연산자의 어느쪽에 = 표현식이 연결되어 있지 않습니다. 여기에 우세 참조에 대해 이야기하는 것은 부적절합니다. –

+0

여기에는 우 가치 참고가 없습니다. –