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