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;
}
需要一些澄清...這個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;
}
您造成未定義行爲,因爲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.
看到一些其他的結果)
@CarlNorum:嗯,這個問題被編輯了......現在我不知道,但是OP描述的行爲表明'a/b'作爲一個雙精度來傳遞(至少在可變參數標準提升之後)。 – 2012-03-19 21:58:43
爲什麼你存入'int'? – Mysticial 2012-03-19 21:40:28
錯誤... sry – cdummy 2012-03-19 21:41:46
printf語句中的不匹配參數將導致未定義的行爲(u)r - 沒有什麼可以進一步解釋的。 – 2012-03-19 21:42:50