2010-07-26 84 views
9

如何以下行通過GCC編譯器的解釋:如何解釋printf語句?

printf("HELLO"); 

我想知道這是因爲當我運行下面的程序:

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

該計劃是打印:

Morning 

編譯器爲什麼從第六個字符開始打印?

回答

22

這裏發生了很多事情。正如其他人所說,printf()不知道有關表達式5+"Good Morning"的任何內容。該表達式的值由C語言確定。

首先,a+b相同b+a,所以5+"Good Morning"相同"Good Morning"+5

現在,"Good Morning"(即字符串文字)的類型是「數組char」。具體而言,"Good Morning"是13個字符的數組(12「常規」字符,後跟0)。在大多數表達式中使用時,type of an array in C會「衰減」爲指向其第一個元素的指針,而二進制加法就是這種情況。這一切都意味着在"Good Morning"+5,"Good Morning"衰減到一個指向它的第一個元素,即字符G

這裏是存儲器的樣子:

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 | 
+---+---+---+---+---+---+---+---+---+---+---+---+---+ 

G加5的地址的值是一個指向上述從G 5個地點,這是M一個指針。因此,printf()獲得的地址是Mprintf()打印,直到找到0。因此,您將看到Morning作爲輸出。

+5

+ +1爲了不貶低它(尤其是「在大多數表達式中,C中數組的類型」衰減「爲指向其第一個元素的指針」而不是「la la la,數組是指針,la la la la 「) – detly 2010-07-26 08:38:41

7

是相同的寫作之後

printf(ptr + 5); 

這是&ptr[5]這個ADRESS點 「晨報」

char *ptr="Good Morning"; 

;

添加一個整數n的指針的結果到ADRESS的ptr + N *的sizeof(類型)

4

由於"Good Morning"是一個字符串指針(實際上到它的第一個字節)並加入5至該指針產生一個指向第5個字符的指針。 C字符串以空字符結尾,因此無論哪種方式,printf都會運行,直到它在結尾處遇到空字符爲止。

25

這是一個C指針算術的工件; printf只是一個紅鯡魚。

類型的字符串的文字(如"Good morning「)是const char *您的代碼等價於:。

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

添加一個指針和一個整數產生一個指針,指向在序列中的第5個元素

+0

Downvoter:care to comment? – 2012-01-10 10:51:40

3

它通過5個字節進入輸入指針,並因此跳過單詞「好」。

這是C. pointer arithmetic

讓我們假設在字符串的基礎指針「早上好」爲p,和5 + P = + 5和它指向信M.

因此,輸入對printf是從信指針M.