如何以下行通過GCC編譯器的解釋:如何解釋printf語句?
printf("HELLO");
我想知道這是因爲當我運行下面的程序:
main()
{
printf(5+"Good Morning");
}
該計劃是打印:
Morning
編譯器爲什麼從第六個字符開始打印?
如何以下行通過GCC編譯器的解釋:如何解釋printf語句?
printf("HELLO");
我想知道這是因爲當我運行下面的程序:
main()
{
printf(5+"Good Morning");
}
該計劃是打印:
Morning
編譯器爲什麼從第六個字符開始打印?
這裏發生了很多事情。正如其他人所說,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()
獲得的地址是M
。 printf()
打印,直到找到0
。因此,您將看到Morning
作爲輸出。
是相同的寫作之後
printf(ptr + 5);
這是&ptr[5]
這個ADRESS點 「晨報」
char *ptr="Good Morning";
;
添加一個整數n的指針的結果到ADRESS的ptr + N *的sizeof(類型)
由於"Good Morning"
是一個字符串指針(實際上到它的第一個字節)並加入5至該指針產生一個指向第5個字符的指針。 C字符串以空字符結尾,因此無論哪種方式,printf
都會運行,直到它在結尾處遇到空字符爲止。
這是一個C指針算術的工件; printf
只是一個紅鯡魚。
類型的字符串的文字(如"Good morning
「)是const char *
您的代碼等價於:。
const char *p = "Good morning";
p = p + 5;
printf(p);
添加一個指針和一個整數產生一個指針,指向在序列中的第5個元素
Downvoter:care to comment? – 2012-01-10 10:51:40
它通過5個字節進入輸入指針,並因此跳過單詞「好」。
這是C. pointer arithmetic
讓我們假設在字符串的基礎指針「早上好」爲p,和5 + P = + 5和它指向信M.
因此,輸入對printf是從信指針M.
+ +1爲了不貶低它(尤其是「在大多數表達式中,C中數組的類型」衰減「爲指向其第一個元素的指針」而不是「la la la,數組是指針,la la la la 「) – detly 2010-07-26 08:38:41