[C con Clase] Prioridad operadores. Punteros a struct

Marving jr.marving en gmail.com
Lun Abr 21 20:47:23 CEST 2014


SD> Esto no es del todo correcto. El operador -> tiene mayor precedencia,
SD> mientras que los operadores * y ++ tienen la misma precedencia.

Lo siento había mirado una hoja de precedencias de operadores, perteneciente
a un viejo libro. En esta hoja aparece en el mismo bloque los operadores de
selección de miembros mediante un apuntador -> y los operadores unarios de
post (incre y decre mento) ++ --.
Me guiaré por la tabla que aparece en vuestro curso, capitulo 14 operador III
precedencia.

SD> Como el operador -> requiere dos operandos y el primero es un operador,
SD> implícitamente tenemos que realizar esta subexpresión del operador ++.
SD> 1º      ptr_strct++->nombre             // aumento el puntero char* nombre
SD> > 2      *((ptr_strct++)->nombre)         // lee el contenido de ese puntero
SD> >      j
SD> >
SD> >
SD> El orden es:
SD> 1º :    ptr_strct++
SD> 2º :    1º -> nombre
SD> 3º :    * 2º
SD> O con paréntesis,
SD> * ( (ptr_strct++) -> nombre )
SD> Sin embargo lo que parece que hace es
SD> > 1º      ptr_strct->nombre
SD> > 2º      *(ptr_strct->nombre)            // B
SD> > 3º      ptr_strct++                     // Aumenta ptr_strct su sizeof
SD> >
SD> >
SD> Bueno, esto es el efecto de las operaciones. Recuerda que estamos usando el
SD> operador ++ de postincremento. Por lo tanto, el efecto del incremento se
SD> realizará después de evaluar la expresión.

Ok. Aclarado.

SD> ---------------------------------------------------------------------
SD> > En la siguiente línea según lo que tengo entendido
SD> > cout <<  ++*ptr_strct->nombre << endl; 
SD> > Tenemos el operando ptr_strct
SD> > sobre el operan
SD> > ++*     y       ->
SD> >
SD> Nuevamente, por claridad, tenemos 3 operadores:
SD> ++,  *,  y  ->
SD> y 2 términos (no son operadores):

¿término y operandos son lo mismo?

SD> ptr_strct  y  nombre
SD> -> tiene mayor prioridad que preincremento ++ y desreferencia *
SD> > 1º      ptr_strct->nombre
SD> > Conflicto entre ++**. Tiene asociatividad derecha izquierda
SD> > 2º      *(ptr_strct)->nombre;           // 'B'
SD> > 3º      ++(*(ptr_strct)->nombre);       // ++'B'
SD> >
SD> > Podría haber aparecido algun mensaje del tipo lvalue required ++
SD> >
SD> No; en este caso no, porque sí tiene un valor modificable: nombre[0], que
SD> pasaría a ser 'C'. Es decir, el comportamiento de ++ en este caso es
SD> equivalente al de esta expresión:
SD> *ptr_strct->nombre = *ptr_strct->nombre + 1;
SD> Sin embargo aparece el mensaje
SD> > RUN FINISHED; Segmentation fault; core dumped; real time: 400ms; user:
SD> > 0ms; system: 0ms
SD> >
SD> Este error del sistema operativo tiene que ver con el hecho de que has
SD> accedido a memoria que no reservaste, a consecuencia de esta
SD> operación: 'ptr_strct++',

si pero después de poner esa sentencia citada,
Puse estas tres, en las que aparentemente restablezco la dirección y los cout
así parece que lo verifica
     ptr_strct = &clnt;
     cout << "Dirección de memoria " << ptr_strct << endl;
     cout << "Contenido            " << ptr_strct->nombre << endl;

Luego ya puse la sentencia de la que hablamos, que genera el error
     cout <<  ++*ptr_strct->nombre << endl; 

En fin no se. Algo se me escapa, creo.


SD> _______________________________________________
SD> Lista de correo Cconclase Cconclase en listas.conclase.net
SD> http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
SD> Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ


Más información sobre la lista de distribución Cconclase