2011-04-10 70 views
3
int j=5,k=9; 
printf("%d...%d"); 

這個問題是在一本書。 輸出給定:5 9 但是,當我嘗試這個我得到:垃圾值,請解釋這一點給我。 書中解釋說,採取的printf程序的前兩個任務的值爲什麼printf語句不能生成本書示例中顯示的輸出?

+5

哪本書教會了你? – icktoofay 2011-04-10 08:31:39

+5

你是否確信這本書沒有寫:'printf(「%d%d \ n」,j,k);'?如果它完全寫出你寫的內容,請隨時停止閱讀那本書並[去找一本更好的C書](http://en.wikipedia.org/wiki/The_C_Programming_Language_(book))。 – sarnold 2011-04-10 08:32:50

+0

是的,同樣的事情是寫在書上,我上面寫了什麼。 – John 2011-04-10 08:34:07

回答

0

嘗試:

int j=5,k=9; 
printf("%d %d", j, k); 
+0

我知道上面會打印答案,但事實並非如此。 – John 2011-04-10 08:32:39

+5

在這種情況下,給自己一塊大石頭,一塊繩子,將石頭綁在書上,然後將它扔進一個非常深的湖中;) – Lindydancer 2011-04-10 08:37:18

1

拿起一些其他的書,的printf( 「%d ...%d」);沒有任何意義。您必須提供兩個整數參數來替換格式字符串中的%d。

3

首先,如果你寫

int j=5,k=9; 
printf("%d...%d", j, k); 

您將獲得5 9.

現在,printf是可以得到可變數量的參數的函數,它解析字符串,這始終是第一個參數並決定從給定參數中放置值的位置。這意味着編譯器沒有執行該函數的參數,這就是爲什麼你沒有得到任何錯誤。

如果參數被壓入堆棧中的函數調用(這是大多數時間的情況下),比printf會看到%d,把堆棧中的下INT的數量(依此類推),因爲你沒除了基本字符串之外不分配參數,堆棧中的數據與函數調用無關(它是相關的,但它不是你想要的:))

+2

即使在一個可以工作的架構中,優化器足夠愚蠢,可以堆棧分配和初始化未引用的局部變量。 – RBerteig 2011-04-10 08:43:20

10

你的書作者依靠愚蠢行爲。 (我不知道這是否是undefinedimplementation definedjust plain stupid。)

他們是靠你的籌碼分配jk變量奇蹟般地在那裏當printf(3)被調用。由於printf(3)將利用其格式字符串,以確定哪些類型的多少對象看,它會神奇解釋jk變量,位於棧上,如參數printf(3)作爲如果他們故意傳遞給它

這太過依賴於「幕後工作如何」的魔力。除非這個代碼塊被「這段代碼可能會告訴你......」和「從不做這種愚蠢的事情......」所包圍,否則這本書可能不值得進一步閱讀。

+1

+1 @sarnold我選擇了簡單的愚蠢。這個假設可能不會是真的! – MByD 2011-04-10 08:40:27

+0

+1,因爲我喜歡這個版本的「書是愚蠢的」,因爲你已經清楚地解釋了本書的例子有什麼問題。就個人而言,我會稱這個代碼「簡單愚蠢」。它愚蠢地依賴於代碼生成器,缺少優化器和調用約定。 – RBerteig 2011-04-10 08:41:32

+0

+1使「書是愚蠢的」令人信服和優雅。對於它的價值,這是UB(未能將匹配的參數號和類型傳遞給'printf')。 – 2011-04-10 14:21:51

相關問題