初學者常被 printf 的格式符搞糊塗:為什麼整數用 %d,長整數用 %lld,雙精度浮點數用 %lf,字符用 %c?本文將從底層原理徹底講透這個問題。
| 數據類型 | 格式符 | 含義來源 | 示例 |
|---|---|---|---|
| int | %d | Decimal(十進制) | printf("%d", 234); |
| long | %ld | Long + Decimal | printf("%ld", 1000L); |
| long long | %lld | Long Long + Decimal | printf("%lld", -93LL); |
| float | %f | Float | printf("%f", 3.14f); |
| double | %lf | Long Float(歷史原因) | printf("%lf", 32e3); |
| char | %c | Character 首字母 | printf("%c", 'e'); |
| 八進制 int | %o | Octal | printf("%o", 037); |
| 十六進制 int | %x | heXadecimal | printf("%x", 255); |
歷史原因:早期 C 語言中 %d 已被 int 佔用,而 float 傳遞給 printf 時會自動提升為 double(默認參數提升規則)。為了區分,double 採用 %lf(Long Float 的縮寫)。在 printf 中 %f 和 %lf 效果相同,但在 scanf 中必須嚴格區分:float 用 %f,double 用 %lf。
#include <stdio.h>
int main(void) {
printf("234=%d\n", 234);
printf("-93=%lld\n", -93LL);
printf("037=%d\n", 037); // 八進制 037 = 十進制 31
printf("037=%c\n", '\037'); // 八進制轉義字符,ASCII 31(控制字符)
printf("32e3=%lf\n", 32e3); // 科學計數法 32×10³ = 32000.0
printf("73.43=%lf\n", 73.43); // 雙精度浮點數
printf("'e'=%c\n", 'e'); // 字符輸出
return 0;
}
「整數看進制,長短看前綴,浮點分精度,字符取首字」
d、八進制 o、十六進制 xl 表示 long,ll 表示 long longf 表示 float,lf 表示 long float (double)c 表示 character