2011-10-16 32 views
2

我從來沒有打擾過尋找printf,因爲我開始學習C++沒有C.現在我想在某些項目中使用格式化輸出。所以我正在尋找一些可以解釋使用printf和IO流之間差異的參考。使用printf函數

我的一個疑問是:

float f = 1.5; 
printf("%d", f); 

爲什麼它打印零? FWIK應該重新解釋float,因爲int是真的嗎?

回答

7

它實際上調用未定義的行爲(UB)。如果格式說明符與傳遞給printf的參數的類型不匹配,那麼它是UB,這意味着會發生任何事情。它可以打印09878978或任何垃圾。任何事情,完全不可預知,都可能發生。如果參數的數據類型爲float,則使用%f

2

因爲%d用於印刷整數,不漂浮。您需要一個浮點格式字符串,如%f

數據類型之間的通常轉換在這裏不起作用,因爲printf是一種可變參數類型的函數,您可以基本上將所需的任何內容推送到堆棧上(或者如果您的實現不是基於堆棧的,與格式字符串中的內容不匹配,所有投注都關閉 - 這是未定義的行爲。

請參閱here以瞭解當您有這種不匹配時可能出錯的事情之一。

4

當您編寫printf("%d", f);時,f的類型必須是int。您編寫的代碼會調用未定義的行爲。從an answer to a similar question摘自:

的fprintf中(7.19.6.1/9),這也適用於在printf文檔中

,它明確規定,如果任何參數是不正確的類型格式說明 - 爲未修改%d ,那就是int - 那麼行爲沒有被定義。


爲什麼它打印零?

也許他們用完了nasal demons

0

是的,你已經有了答案,%d只會打印整數值。使用「%f」代表浮點值。如果您使用的是%f,您將獲得1.500000

0

如果您不想使用%d格式說明符,那麼最好是將其明確輸入以避免調用UB(未定義行爲)。

float f = 1.5; 012fprintf(「%d」,(int)f);