Qui stanno accadendo molte cose. Come altri hanno già detto, printf()
non "sa" nulla dell'espressione 5+"Good Morning"
. Il valore di tale espressione è determinato dal linguaggio C.
Primo, a+b
è lo stesso di b+a
, quindi 5+"Good Morning"
è lo stesso di "Good Morning"+5
.
Ora, il tipo di "Good Morning"
(ovvero, una stringa letterale) è un "array di char
". Nello specifico, "Good Morning"
è un array di 13 caratteri (12 caratteri "normali", seguito da un 0
). Se utilizzato nella maggior parte delle espressioni, il "decadimento" type of an array in C è puntato al suo primo elemento e l'aggiunta binaria è uno di questi casi.Tutto ciò significa che in "Good Morning"+5
, "Good Morning"
decadono in un puntatore al suo primo elemento, che è il carattere G
.
Ecco come la memoria si presenta come:
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 |
+---+---+---+---+---+---+---+---+---+---+---+---+---+
Il valore dell'indirizzo di G
più 5 è un puntatore che punta a 5 posizioni da G
sopra, che è M
. Quindi, printf()
sta ottenendo un indirizzo che è a M
. printf()
stampa fino a quando non trova uno 0
. Quindi vedi Morning
come output.
fonte
2010-07-26 08:30:32
+1 per non sminuirlo (specialmente "nella maggior parte delle espressioni, il tipo di un array in C" decade "a un puntatore al suo primo elemento" invece di "la la la, un array è un puntatore, la la la ") – detly