由於它沒有強類型,我認爲它只是選擇了正確的內存大小並根據參數的類型對其進行了解釋。但是float和double都使用%f並且它們的大小不同。printf和co如何區分float和double
P.S. 我可以看到如何通過將值複製到臨時值並進行鑄造(是嗎?)可能會工作 但它對scanfs/sscanf是如何工作的?
由於它沒有強類型,我認爲它只是選擇了正確的內存大小並根據參數的類型對其進行了解釋。但是float和double都使用%f並且它們的大小不同。printf和co如何區分float和double
P.S. 我可以看到如何通過將值複製到臨時值並進行鑄造(是嗎?)可能會工作 但它對scanfs/sscanf是如何工作的?
它不區分。無法收到float
作爲變量:您提供的任何float
論點首先被提升爲double
。
6.5.2.2/6定義了「默認參數促銷」,並且/ 7規定默認參數促銷應用於「結尾參數」,即可變參數...
。
它對scanfs/sscanf有效嗎?
的%f
格式scanf
需要一個指針float
。 %lf
需要指向double
的指針,%Lf
需要指向long double
的指針。
的值複製到臨時和鑄造(這是正確的?)
如果你提供一個浮點參數,則實現創建一個臨時double類型,與浮點值初始化,並將其作爲可變參數傳遞。按照定義投射顯式通過使用投射操作符進行轉換 - 您可以根據需要進行投射,以便使讀者完全清楚發生了什麼,但float f = 3; printf("%f", f);
與float f = 3; printf("%f", (double)f);
完全相同。默認參數提升的含義與演員相同。
scanf怎麼樣? –
謝謝,printfs(標準或擴展)接受雙倍以及保持對稱? –
哦,如果你的意思是「我可以在'printf'和co中使用%lf和%Lf作爲格式嗎?那麼是的,你可以。 %lf與%f完全相同,都採用'double'。 %Lf需要一個「長雙」。 –
[爲什麼printf()將浮點數提升爲double?](http://stackoverflow.com/q/28097564/995714) –