int j=5,k=9;
printf("%d...%d");
這個問題是在一本書。 輸出給定:5 9 但是,當我嘗試這個我得到:垃圾值,請解釋這一點給我。 書中解釋說,採取的printf程序的前兩個任務的值爲什麼printf語句不能生成本書示例中顯示的輸出?
int j=5,k=9;
printf("%d...%d");
這個問題是在一本書。 輸出給定:5 9 但是,當我嘗試這個我得到:垃圾值,請解釋這一點給我。 書中解釋說,採取的printf程序的前兩個任務的值爲什麼printf語句不能生成本書示例中顯示的輸出?
嘗試:
int j=5,k=9;
printf("%d %d", j, k);
我知道上面會打印答案,但事實並非如此。 – John 2011-04-10 08:32:39
在這種情況下,給自己一塊大石頭,一塊繩子,將石頭綁在書上,然後將它扔進一個非常深的湖中;) – Lindydancer 2011-04-10 08:37:18
拿起一些其他的書,的printf( 「%d ...%d」);沒有任何意義。您必須提供兩個整數參數來替換格式字符串中的%d。
首先,如果你寫
int j=5,k=9;
printf("%d...%d", j, k);
您將獲得5 9.
現在,printf
是可以得到可變數量的參數的函數,它解析字符串,這始終是第一個參數並決定從給定參數中放置值的位置。這意味着編譯器沒有執行該函數的參數,這就是爲什麼你沒有得到任何錯誤。
如果參數被壓入堆棧中的函數調用(這是大多數時間的情況下),比printf
會看到%d
,把堆棧中的下INT的數量(依此類推),因爲你沒除了基本字符串之外不分配參數,堆棧中的數據與函數調用無關(它是相關的,但它不是你想要的:))
即使在一個可以工作的架構中,優化器足夠愚蠢,可以堆棧分配和初始化未引用的局部變量。 – RBerteig 2011-04-10 08:43:20
你的書作者依靠愚蠢行爲。 (我不知道這是否是undefined
或implementation defined
或just plain stupid
。)
他們是靠你的籌碼分配j
和k
變量奇蹟般地在那裏當printf(3)
被調用。由於printf(3)
將利用其格式字符串,以確定哪些類型的多少對象看,它會神奇解釋j
和k
變量,位於棧上,如參數到printf(3)
,作爲如果他們故意傳遞給它。
這太過依賴於「幕後工作如何」的魔力。除非這個代碼塊被「這段代碼可能會告訴你......」和「從不做這種愚蠢的事情......」所包圍,否則這本書可能不值得進一步閱讀。
哪本書教會了你? – icktoofay 2011-04-10 08:31:39
你是否確信這本書沒有寫:'printf(「%d%d \ n」,j,k);'?如果它完全寫出你寫的內容,請隨時停止閱讀那本書並[去找一本更好的C書](http://en.wikipedia.org/wiki/The_C_Programming_Language_(book))。 – sarnold 2011-04-10 08:32:50
是的,同樣的事情是寫在書上,我上面寫了什麼。 – John 2011-04-10 08:34:07