2012-03-19 114 views
1

需要一些澄清...這個printf如何在這個程序中工作 - 在c中進行澄清?

爲什麼我得到2.50 0 0 0.0作爲輸出?

#include<stdio.h> 
int main() 
{ 
    float a=5.0,b=2.0; 
    printf("%f %d\n",a/b,a/b); 
    printf("%d %f",a/b,a/b); 
    return 0; 
} 
+0

爲什麼你存入'int'? – Mysticial 2012-03-19 21:40:28

+0

錯誤... sry – cdummy 2012-03-19 21:41:46

+5

printf語句中的不匹配參數將導致未定義的行爲(u)r - 沒有什麼可以進一步解釋的。 – 2012-03-19 21:42:50

回答

4

您造成未定義行爲,因爲a/b的類型(晉升)double,這不符合格式說明%d(其預計的int)。

(你看到0的原因可能是因爲你碰巧訪問sizeof(int)字節都是零,像2.5作爲(很短的一部分)尾數一個簡單的數字,並且您的平臺存儲浮點數爲IEEE754在小尾數順序:

|  <-- * -->   // * = sizeof(int) 
400 | 4 0000 0000 0000   // == 2.5 
S+E | Mantissa 

嘗試2./5.看到一些其他的結果)

+0

@CarlNorum:嗯,這個問題被編輯了......現在我不知道,但是OP描述的行爲表明'a/b'作爲一個雙精度來傳遞(至少在可變參數標準提升之後)。 – 2012-03-19 21:58:43