Aquí suceden muchas cosas. Como han dicho otros, printf()
no 'sabe' nada sobre 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
, entonces 5+"Good Morning"
es lo mismo que "Good Morning"+5
.
Ahora, el tipo de "Good Morning"
(es decir, un literal de cadena) es una "matriz de char
". Específicamente, "Good Morning"
es una matriz de 13 caracteres (12 caracteres "regulares", seguidos de 0
). Cuando se usa en la mayoría de las expresiones, el type of an array in 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"
se desintegra a un puntero a su primer elemento, que es el carácter G
.
Aquí es cómo se ve la memoria como:
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 poblaciones de G
anteriormente, que se M
. Entonces, printf()
está obteniendo una dirección que está en M
. printf()
imprime hasta que encuentra un 0
. Por lo tanto, verá Morning
como salida.
+1 para no estorbar (especialmente en la mayoría de las expresiones, el tipo de una matriz en C "decae" en un puntero a su primer elemento "en lugar de" la la la, una matriz es un puntero, la la la ") – detly