我目前正在學習 C 語言資料型別,我嘗試列印一個雙變數,編譯器建議我在鍵入“%”后使用 fl,并且在精度十進制行的末尾得到 1 個數字。與 %lf 相比,它將總共列印六位精度小數
double num=12322;
printf("%lf",num);// result is 12322.000000
printf("%fl",num);// result is 12322.0000001
我搜索了很多地方,但大多數人經常問到 %f 和 %lf 之間的區別。我的情況可能是一樣的嗎?
uj5u.com熱心網友回復:
在這個電話中 printf
printf("%lf",num);// result is 12322.000000
l轉換說明符中的長度修飾符%lf不起作用。
來自 C 標準(7.21.6.1 fprintf 函式)
7 長度修飾符及其含義是:
l (ell) 指定后面的 d、i、o、u、x 或 X 轉換說明符適用于 long int 或 unsigned long int 引數;后面的 n 轉換說明符適用于指向 long int 引數的指標;以下 c 轉換說明符適用于 wint_t 引數;后面的 s 轉換說明符適用于指向 wchar_t 引數的指標;或對后面的 a、A、e、E、f、F、g 或 G 轉換說明符沒有影響。
在這個電話中 printf
printf("%fl",num);// result is 12322.0000001
在評論中應該寫字母'l'而不是1您認為的數字
// result is 12322.000000l
^^^
格式字串"%fl"意味著由于轉換規范,在輸出 double 型別的物件后,%f將輸出 letter 'l'。
請注意,使用轉換說明符f可以多使用一個字母'l',即大寫字母'L'。在這種情況下,轉換規范%Lf用于輸出型別的物件long double。
uj5u.com熱心網友回復:
我認為你的輸出實際上有一個錯字......
double num=12322;
printf("%lf",num);// result is 12322.000000
printf("%fl",num);// result is 12322.0000001
實際上是
double num=12322;
printf("%lf",num);// result is 12322.000000
printf("%fl",num);// result is 12322.000000l
C 標準說當傳遞給可變引數函式時,將float轉換為 a double,所以%lf和%f是等價的;%fl與 a %f...相同,l后面有一個。
uj5u.com熱心網友回復:
有兩種列印 type 值的正確方法double:
printf("%f", num);
或者
printf("%lf", num);
這兩個效果完全一樣。在這種情況下,"l"實際上忽略了修飾符。
它們具有相同效果的原因printf是特殊的。 printf接受可變數量的引數,對于此類函式,C 始終應用默認引數提升。這意味著所有小于 的整數型別int都被提升為int,并且float被提升為double。所以如果你寫
float f = 1.5;
printf("%f\n", f);
然后在通過之前被f提升double。所以在里面printf,它總是得到一個double. 所以%f永遠不會看到一個float,總是一個double。所以%f寫成期望 a double,所以它最終對float 和 都有效 double。所以你不需要l修飾符來說明哪個。但這有點令人困惑,所以標準說l如果你愿意,你可以把它放在那里——但你沒有必要,而且它沒有任何作用。
(順便說一下,這完全不同,from scanf, where%f和%lf完全不同,并且必須顯式匹配型別float *vs 的引數double *。)
我不知道為什么你的 IDE 抱怨 (在下面畫一條紅線) %lf,我不知道建議是什么意思,正如你所說,
fl, lg, l, f,
elf, Alf, ls, sf,
if, la, lo, of
其中一些看起來可能是非標準的、特定于系統的擴展,但有些(尤其是fl)是無稽之談。因此,最重要的是,聽起來您的 IDE 的建議令人困惑、不必要,而且很可能是錯誤的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/335626.html
上一篇:在c程式中翻譯這個數學函式
下一篇:為什么創建二叉樹會出現問題?
