為什么代碼僅在我使用 %lf 或 %f 占位符(第二個占位符)時才有效,而在我使用 %d 時列印 0?
#include <stdio.h>
void main()
{
long id;
id = 123456789;
double Hourly;
Hourly = 30;
int HoursAday, daysAweek, Fired, Hired;
HoursAday = 8; daysAweek = 5; Fired = 2021; Hired = 2019;
printf("bob, id: \"%d\" should get %lf", id, (Hourly * HoursAday * daysAweek) * (Fired - Hired));
uj5u.com熱心網友回復:
的型別(Hourly * HoursAday * daysAweek) * (Fired - Hired)
是double
正確的說明符是%lf
。由于可變引數默認轉換,代碼也適用于%f
(*)。但是%d
是未定義的行為。
此外,id
(型別為long
)的正確說明符是%ld
. %d
是未定義的行為。
請參閱 printf 的檔案:https : //en.cppreference.com/w/c/io/fprintf
(*)float
可變引數總是被轉換為double
. 所以printf
函式族永遠不會收到a float
,他們總是會收到a double
。這就是為什么%f
并且%lf
出于實際原因是等效的。
uj5u.com熱心網友回復:
這個表情
(Hourly * HoursAday * daysAweek) * (Fired - Hired)
具有型別double
由于通常的算術轉換,因為變數Hourly
有型別double
。也就是說,如果double
在二元運算中一個運算元具有該型別而另一個運算元具有整數型別,那么具有整數型別的運算元將轉換為該型別double
。
使用錯誤的轉換說明符%d
設計為輸出該型別int
的物件和該型別的物件會double
呼叫未定義的行為。
請注意,在此轉換說明符中%lf
,長度修飾符l
不起作用。所以使用%f
.
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/336480.html
上一篇:分配給具有陣列型別的運算式時出錯