¿Cómo se interpreta la statement printf?

Cómo se interpreta la siguiente línea por el comstackdor GCC:

printf("HELLO"); 

Quiero saber esto porque cuando estoy ejecutando el siguiente progtwig:

 main() { printf(5+"Good Morning"); } 

El progtwig se está imprimiendo:

 Morning 

¿Por qué el comstackdor está iniciando la impresión desde el sexto carácter?

Hay muchas cosas sucediendo aquí. Como han dicho otros, printf() no “sabe” nada acerca de la expresión 5+"Good Morning" . El valor de esa expresión está determinado por el lenguaje C.

Primero, a+b es lo mismo que b+a , por lo que 5+"Good Morning" es lo mismo que "Good Morning"+5 .

Ahora, el tipo de "Good Morning" (es decir, una cadena literal) es una “matriz de caracteres”. Específicamente, "Good Morning" es una matriz de 13 caracteres (12 caracteres “regulares”, seguidos de un 0 ). Cuando se usa en la mayoría de las expresiones, el tipo de una matriz en C “decae” en un puntero a su primer elemento, y la adición binaria es uno de esos casos. Todo esto significa que en "Good Morning"+5 , "Good Morning" decae en un puntero a su primer elemento, que es el carácter G

Así es como se ve la memoria:

  0 1 2 3 4 5 6 7 8 9 0 1 2 +---+---+---+---+---+---+---+---+---+---+---+---+---+ | G | o | o | d | | M | o | r | n | i | n | g | 0 | +---+---+---+---+---+---+---+---+---+---+---+---+---+ 

El valor de la dirección de G más 5 es un puntero que apunta a 5 ubicaciones desde G arriba, que es M Entonces, printf() está obteniendo una dirección que está en M printf() imprime que hasta que encuentra un 0 . Por eso ves la Morning como salida.

Este es un artefacto de C puntero-aritmética; printf es solo una pista falsa.

El tipo de un literal de cadena (como "Good morning “) es const char * . Su código es equivalente a:

 const char *p = "Good morning"; p = p + 5; printf(p); 

Al agregar un puntero y un entero, se genera un puntero al quinto elemento de la secuencia.

Es lo mismo que escribir.

 char *ptr="Good Morning"; 

seguido por

 printf( ptr + 5 ); 

que es &ptr[5] esta dirección apunta a “Mañana”;

Agregar un entero n a los resultados de un puntero a una dirección ptr + n * sizeof (tipo)

Porque "Good Morning" es un puntero a la cadena (en realidad al primer byte) y al agregar 5 a ese puntero se obtiene un puntero al quinto carácter. Las cadenas C terminan en nulo, por lo que, printf ejecuta hasta que encuentra el nulo al final.

Avanza el puntero de entrada en 5 bytes y, por lo tanto, omite la palabra “Bueno”.

Esto es aritmética de punteros en C.

Supongamos que el puntero base de la cadena “Buenos días” es p, y 5 + p = p + 5 y apunta a la letra M.

Por lo tanto, la entrada a printf es el puntero de la letra M.