Оператор -> не работает должным образом в C ++ - PullRequest
5 голосов
/ 03 января 2012

Я практиковал один связанный список в c ++ (изучал, как найти начальный узел кругового списка), но нашел использование оператора -> очень запутанным. Я использую Visual Studio 2010 C ++ Express

Это прекрасно работает: head->append(2)->append(3)->append(4)->append(5)

Но это не работает (для создания кругового связанного списка): head->append(2)->append(3)->append(4)->append(5)->append(head->next)

Когда я запускаю этот метод и отлаживаю, кажется, что head->next неправильно передается в метод.

Но это работает:

  1. Node* tail=head->append(2)->append(3)->append(4)->append(5); tail->append(head->next);
  2. Или после того, как я изменил return c->next на return head в двух методах, head->append(2)->append(3)->append(4)->append(5)->append(head->next) также работает.

Что мне здесь не хватает? Спасибо!

Подробности моего кода следующие:

void main(){
    Node* head=new Node(1);
    Node* tail=head->append(2)->append(3)->append(4)->append(5)->append(head->next);
    cin.get();
}

class Node{
public:
    Node* next;
    int data;
    bool marked;

    Node(int d){
        data=d;
        marked=false;
        next=NULL;
    }

    Node* append(int d){
        Node* c=this;
        while(c->next!=NULL){
            c=c->next;
        }
        c->next=new Node(d);
        return c->next;
    }

    Node* append(Node* n){
        Node* c=this;
        while(c->next!=NULL){
            c=c->next;
        }
        c->next=n;
        return c->next;
    }
};

Ответы [ 4 ]

10 голосов
/ 03 января 2012

Вы испытываете неопределенное поведение .

Проблема в том, что вы ожидаете, что head->next будет оцениваться в определенное время (прямо перед вызовом последнего append().не гарантируется.

2 голосов
/ 03 января 2012

head->next оценивается первым. Компилятор может это сделать; см этот вопрос .

2 голосов
/ 03 января 2012

Когда вы передаете head->next - его перед изменением на head->append.Боюсь, вы путаете порядок записи с порядком выполнения.

В этом случае вы меняете значение и читаете его в одном и том же операторе выполнения, это неопределенное поведение.

0 голосов
/ 03 января 2012

head-> next равно NULL (ни на что не указывает) во время вычисления оператора.

...