2012-01-03 24 views
5

estaba practicando lista enlazada simple en C++ (practicar cómo encontrar el nodo inicial de la lista circular), pero se encontró con el uso de operador -> muy confuso. Estoy usando Visual Studio 2010 C++ Expressoperador -> no funciona como se esperaba en C++

Esto funciona perfectamente: head->append(2)->append(3)->append(4)->append(5)

Pero esto no funciona (para crear una lista enlazada circular): head->append(2)->append(3)->append(4)->append(5)->append(head->next)

Cuando salto en este método y depurar , parece que head->next no se pasa correctamente en el método.

Pero esto funciona:

  1. Node* tail=head->append(2)->append(3)->append(4)->append(5); tail->append(head->next);
  2. o después de cambiar return c->next-return head en los dos métodos, head->append(2)->append(3)->append(4)->append(5)->append(head->next) también funciona.

¿Qué es lo que falta aquí? ¡Gracias!

detalles de mi código es el siguiente:

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; 
    } 
}; 
+1

es que un nuevo récord para el encadenamiento de indirección – Mysticial

+0

es esta UB por casualidad..?? –

+0

@Mysticial - I Creo que una vez utilicé una cadena más larga en un proyecto, pero lo perdí de vista. –

Respuesta

10

comportamiento indefinido.

El problema es que usted está esperando head->next a ser evaluados en un momento determinado (a la derecha antes de llamar a la última append(). Pero eso no está garantizado.

+0

Entonces, ¿no está definido en el estándar C++, y cada compilador puede interpretarlo a su manera? – user1128516

+1

Eso es correcto. Cuando el orden de evaluación es importante para usted (como lo es aquí), separe esas llamadas. –

2

Cuando estás pasando head->next - antes de cambiar su con head->append. Me temo que estás confundiendo el orden de la escritura con el orden de ejecución.

En este caso, está cambiando el valor y lo está leyendo en la misma instrucción de ejecución, eso es un comportamiento indefinido.

+0

¡Gracias! Lo tengo. – user1128516

2

head->next se evalúa primero. El compilador está en libertad de hacerlo ; ver this question

+0

¡Lo tengo! Gracias – user1128516

0

cabeza-> siguiente es NULL (no apunta a nada) en el momento en que se evalúa la declaración

+0

Tal vez, tal vez no. –

+0

Quizás no, pero muy probablemente. Tendríamos que examinar con certeza los resultados del compilador, pero lo más probable es que use el valor de head-> next al comienzo de la evaluación de la sentencia completa. El constructor se establece al lado de NULL. –

Cuestiones relacionadas