[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