¿Alguien puede decirme el flujo de referencias en la segunda declaración printf en el código dado?

#include <stdio.h>
char *c[]={"ENTNG", "NST","AMAZI","FIRBE"};
char** cp[]={c+3, c+2, c+1, c};
char ***cpp= cp;
int main() {
    printf("%s",**++cpp);
    printf("%s ",*--*++cpp+3);
    printf("%s",*cpp[-2]+3);
    printf("%s",cpp[-1][-1]+1);
}

preguntado el 09 de enero de 11 a las 09:01

¿El segundo printf salida "ST"? -

Me pregunto por qué alguien querría saber el resultado de tal lío. Si se trata de un código de producción, despida a la persona que lo escribió. Si esta tarea o asignación o lo que sea, tal vez publique el nombre de su universidad para que la gente sepa adónde van cuando se matriculen. -

3 Respuestas

 char *c[]= {
              "ENTNG", 
              "NST",
              "AMAZI",
              "FIRBE"
            }; 

*c[]evalúa a un carácter, entonces c [] apunta a personajes y c es una matriz de puntero a carácter. Los elementos de c se han inicializado para apuntar a las matrices de caracteres

"ENTNG", "NST", "AMAZI" and "PIRBE"

.

char** cp[]={c+3, c+2, c+1, c};

**cp[] evalúa a un personaje,*cp[] es un puntero a carácter y cp [] es un puntero a puntero a carácter. Por lo tanto cp es una matriz de punteros a puntero a carácter. Los elementos de cp se han inicializado para apuntar a los elementos de c.

char ***cpp= cp;

***cpp evalúa a un personaje, **cpp apunta a un personaje, *cpp apunta a un puntero a carácter, y cpp apunta a un puntero a puntero a carácter.

*(*(++cpp));         // Increment cpp and then follow the pointers 

Op : "AMAZI"

(*(--(*(++cpp))))+3; // Increment cpp,follow  the pointer to cp[2],
                     // decrement cp[2],follow  the pointer to  c[0],
                     // index  3 from  the address in  c[0].

Op : "NG "

(*(cpp[-2]))+3;      // Indirectly reference  - 2  from cpp yielding cp[0],
                     // follow  the pointer to c[3]; 
                     // index  3 from  the address in  c[3].

Op : "BE"

(cpp[-1][-1])+1      // Indirectly reference -1 from cpp yielding cp [1],
                     // indirectly reference  - 1 from 
                     // cp[1] yielding  c[1],index  1 from  the address in c[1].

Op : "ST"

La salida sería AMAZING BEST


fuente: El libro de rompecabezas de C

Respondido el 09 de enero de 11 a las 13:01

Bueno, la salida es "INCREÍBLE MEJOR".

Puede comprobar la orden de evaluación utilizando el tabla de precedencia de operadores para C.

Respondido el 08 de junio de 12 a las 16:06

cout << (**++cpp) ;
// **++cpp =:= **(cpp = cp+1) =:= *(c+2) =:= "AMAZI"
// side-effect: cpp -> cp+1
cout << (*--*++cpp+3) << " ";
// *--*++cpp+3 =:= *--*(cpp = cp+2)+3 =:= *--(cp+2)+3 =:= *(cp[2] = c)+3 =:= "NG"
// side-effect: cpp -> cp+2, cp => {c+3, c+2, c, c}
cout << (*cpp[-2]+3);
// *cpp[-2]+3 =:= **(cp+2-2)+3 =:= *(c+3)+3 =:= "BE", thus print "BE"
cout << (cpp[-1][-1]+1) << endl;
// cpp[-1][-1]+1 =:= *(*(cp+2-1)-1)+1 =:= *(c+2-1)+1 =:= "ST"
return 0;

Respondido 03 Jul 14, 05:07

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.