[英]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)
時,它們依賴於堆棧分配的j
和k
變量。 因為printf(3)
將使用其格式字符串來確定要讀取多少對象的類型 ,它會神奇地將位於堆棧上的j
和k
變量解釋為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.