2016-03-14 175 views
-2
#include<conio.h> 
#include<stdio.h> 

main() 
{ 
    printf(" %d %f ",4.0,4.0); 
    getch(); 
} 

我收到輸出04.000000 我想知道爲什麼4.0成爲zero爲整數說明符使用? 爲什麼它不被截斷爲4關於訪問說明符

+5

請從本世紀搜索一些介紹性的C教程/書。 –

+1

由於4.0二進制表示是'0x40100000_00000000',%d需要從它最後4個字節,即'0x00000000' –

+0

啓用適當的警告和將它們視爲錯誤:克++:'警告:ISO C++禁止「主」的聲明無類型[-Wpedantic]'和'警告:格式「%d」需要類型的參數「詮釋」,但參數2的類型是「雙師型」 [-Wformat =]' –

回答

1

爲了說服你的自我請嘗試以下操作。有幾件事情需要注意 - 將float隱式轉換爲int,通過printf()從堆棧中進行參數訪問,這決定了存儲器的位置和大小以獲取基於格式說明符存儲的值。

printf(" %d %f ", (int)4.0, 4.0); 
printf(" %d %f ", (float)4, 4.0); 
printf(" %d %f ", (float)0, 4.0); 
+0

如果,如果我不想做明確的類型轉換?爲什麼沒有遇到隱式轉換? –

+0

如果你沒有明確強制類型轉換,則編譯器會考慮使用推所需的字節數的浮點數據(因爲它不會對printf函數的內部工作原理,即,它需要多少字節讀取線索,由格式說明符決定)表示與Leshane和Scott之前提到的一樣的值。 – Ravi

0

你基本上printf,通過它,你在一個整數一個承諾浮點值; @Lashane解釋它是如何可能已經拿出0(4.0二進制表示爲0x40100000_00000000,並且%d需要的最後4個字節裏面全是0)。但是,由於這是未定義的行爲,因此在不同情況下可能會得到不同的結果。

+0

由於評論可能會消失,所以您應該將其添加到您的答案中(並注意它是未定義的行爲,因此必須避免)。 (只是說,沒有downvote) –

+0

啊這將是可能的原因 –