2010-07-26 7 views
9

Come è la seguente riga interpretata dal compilatore GCC:Come viene interpretata la dichiarazione di printf?

printf("HELLO"); 

Voglio sapere questo perché quando sto facendo funzionare seguente programma:

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

Il programma è la stampa:

Morning 

Perché il compilatore sta iniziando la stampa dal sesto carattere?

risposta

22

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.

+5

+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

7

IS è lo stesso di scrittura

char *ptr="Good Morning"; 

seguito da

printf(ptr + 5); 

che è &ptr[5] questi punti a "Morning" indirizzo;

Aggiunta un intero n ad un risultato puntatore a un indirizzo ptr + n * sizeof (tipo)

4

Poiché "Good Morning" è un puntatore alla stringa (sino al primo byte di esso) e aggiungendo 5 a quello puntatore produce un puntatore al quinto carattere. Le stringhe C sono terminate da null, quindi in entrambi i casi, printf viene eseguito fino a quando non incontra il valore null alla fine.

25

Questo è un artefatto del puntatore-aritmetico C; printf è solo un'aringa rossa.

Il tipo di una stringa letterale (come "Good morning ") è const char * Il codice è equivalente a:..

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

Aggiunta di un puntatore e un intero produce un puntatore al 5 ° elemento della sequenza

+0

Downvoter: cura di commentare? –

3

avanza il puntatore di ingresso da 5 byte e quindi salta la parola "buono".

Questo è pointer arithmetic in C.

Assumiamo puntatore base della stringa "buon giorno" è p, e 5 + p = p + 5 e fa riferimento ai lettera M.

qui l'ingresso printf è il puntatore dalla lettera M.

Problemi correlati