printf("%f\n",x);
x
具有類型long
,但%f
轉換器需要一個浮點值(double
類型)。通常,當您將一個整數傳遞給需要浮點值的函數時,該值將被靜默轉換。但是,這僅適用於具有固定數量參數的函數以及指示每個參數類型的原型。它不適用於可變參數函數,如printf
,因爲編譯器沒有足夠的信息來知道將值轉換爲:格式字符串只能在運行時進行分析。
語言規範留下了這個程序的行爲未定義:它可以做任何事情。在這種情況下可能發生的情況是x
存儲在某個整數寄存器中,並且f
存儲在某個浮點寄存器中。由於printf
調用正在尋找一個浮點值,因此編譯後的代碼會查找第一個浮點寄存器。如果您將浮點值傳遞給printf
,則該參數將會在該寄存器中結束。但是你沒有,所以該寄存器中的值是存儲在那裏的最後一個值:由scanf
讀取的值。
一個好的編譯器會警告你你做錯了什麼。例如,這裏就是我得到的,當我與gcc -O -Wall
編譯代碼:
a.c:2: warning: return type of 'main' is not 'int'
a.c: In function 'main':
a.c:7: warning: format '%d' expects type 'int', but argument 2 has type 'double'
a.c:9: warning: format '%f' expects type 'double', but argument 2 has type 'long int'
a.c:12: warning: format '%f' expects type 'double', but argument 2 has type 'long int'
a.c:15: warning: format '%f' expects type 'double', but argument 2 has type 'long int'
a.c:18: warning: format '%f' expects type 'double', but argument 2 has type 'long int'
,我建議配置您的編譯器打印這樣的警告,並關注他們。
爲了使程序正常工作,可以在需要的時候傳遞一個浮點值,或者告訴printf
期望一個整數值。無論是
printf("%f", (double)x);
或
printf("%ld", x);
是的,我們能做到。但我們不會因爲你在錯誤的地方問這個問題。請在CodeReview上提問。 – 2012-08-15 13:17:12
您是否查找了正在使用的函數的文檔?你不明白什麼? – moooeeeep 2012-08-15 13:17:14
不確定你的意思。但是,您正在使用浮點格式打印出一個長變量並且無法正常工作。打印x時使用%d而不是%f。 – 2012-08-15 13:17:26