2012-03-19 62 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