| 操作 | 正確格式符 | 錯誤示例 | 原因 |
|---|---|---|---|
scanf 輸入 | %lf | %f | scanf 需要地址,%f 對應 float*,%lf 對應 double*,類型不匹配導致未定義行為 |
printf 輸出 | %f (或 %lf) | 無 | 可變參數傳遞時 float 自動提升為 double,兩者等效 |
scanf 通過指針寫入內存,必須精確知道目標對象的大小與佈局:
%f → 期望 float *(4 字節)%lf → 期望 double *(8 字節)若傳入 double * 卻用 %f,scanf 只會寫入 4 字節,導致高 4 字節殘留垃圾值,結果完全錯誤。
根據 C 標準,可變參數函數(如 printf)調用時,float 會 自動提升為 double。因此:
float 實際傳遞的是 doubledouble 保持不變printf 內部無法區分原類型,%f 和 %lf 行為完全一致(C99 起 %lf 合法)#include <stdio.h>
int main(void) {
double d = 3.141592653589793;
// 輸入演示
double input;
printf("請輸入一個 double 值: ");
scanf("%lf", &input); // 必須用 %lf
printf("讀入值: %.10f\n", input);
// 輸出演示
printf("使用 %%f: %.10f\n", d);
printf("使用 %%lf: %.10f\n", d); // C99 標準下等效
printf("使用 %%.15e: %.15e\n", d); // 科學計數法更直觀
return 0;
}
%lf 輸入,%f 輸出:形成肌肉記憶,避免混淆。%.15g 或 %.15e:double 約 15-17 位有效數字,%f 默認僅 6 位小數易丟失精度。long double):輸入 %Lf,輸出 %Lf / %Le。scanf("%lf", &d) 會跳過空白字符,讀取至非數字字符停止,返回值檢查(返回 1 表示成功)是良好習慣。double 輸入用 %lf,輸出用 %f(或 %lf),本質差異在於 scanf 需精確類型寫內存,而 printf 享受默認參數提升。牢記此規則,配合精度控制,即可精準掌控浮點數輸入輸出。