經典新手代碼:
int a = 5;
float b = 2.5;
printf("%d", b); // 輸出 0
printf("%f", b); // 輸出 2.500000
%d 輸出 0?printf 是可變參數函數,**編譯器不會檢查格式字符串與實際參數類型是否匹配**。當用 %d 時,`printf` 按照 int 的大小(通常 4 字節)從棧上讀取資料,但 float 在傳參時會被默認提升為 double(8 字節),且內存佈局完全不同,導致讀取到的位模式被解釋為整數 0。
float/double 必須用 %f(或 %e/%g);int 用 %d;-Wall -Wformat),GCC/Clang 會在編譯期提示格式不匹配。%f 輸出 2.000000?原文提到 %f 輸出 2.000000,實際應為 2.500000。若出現 2.000000,請檢查代碼中是否將 b 錯賦值為 2.0 或存在隱式轉換截斷。