為什么代碼僅在我使用 %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
上一篇:分配給具有陣列型別的運算式時出錯
