簡體   English   中英

為什么這個printf語句不會產生書中示例中顯示的輸出?

[英]Why doesn't this printf statement produce the output shown in a book example?

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

這個問題出現在一本書中。 給出的輸出:5 9但是當我嘗試這個時我得到了:垃圾值,請向我解釋一下。 書中的解釋說printf取得了程序前兩個賦值的值

你的書作者依賴於愚蠢的行為。 (我不知道它是undefined還是implementation defined或者just plain stupid 。)

當調用printf(3)時,它們依賴於堆棧分配的jk變量。 因為printf(3)將使用其格式字符串來確定要讀取多少對象的類型 ,它會神奇地將位於堆棧上的jk變量解釋為printf(3) 參數就好像它們已經被傳遞一樣故意

這太依賴於“幕后如何運作”的魔力。 除非這個代碼塊被“這段代碼可能會顯示給你......”和“永遠不做這個愚蠢的事......”所包圍,否則這本書可能不值得再讀了。

首先,如果你寫

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

你會得到5 9。

現在, printf是一個可以獲取可變數量參數的函數,它解析String,它始終是第一個參數,並決定從給定參數中放置值的位置。 這意味着編譯器沒有強制執行有關函數的參數,這就是為什么你沒有得到任何錯誤。

如果參數在函數調用中被推送到堆棧(大多數情況下是這種情況),則printf將看到%d並將下一個int作為數字放在堆棧上(依此類推),因為你沒有分配除了基本字符串之外的參數,堆棧上的數據與函數調用無關(它是相關的,但它不是你想要的:))

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

嘗試:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM