2013-10-20 22 views
0
#include<stdio.h> 
#include<math.h> 
int main() 
{ 

printf("%f",3/2); 
printf(" %d",3/2); 
printf(" %d",3<<2); 
return 0; 

} 

这里是我的代码,我期待得到1.50000 112为什么我在执行printf(“%f”,3/2)时得到2.168831?

但我收到2.168831 112

我的输出。

+0

整数除法结果为整数,并截断小数部分。这写在每一个合理的好初学C教程,并在堆栈溢出至少一百个答案。做一些研究。 – 2013-10-20 09:42:44

+0

嗨,感谢您的回复,即时通讯相当新的在这里抱歉,试图寻找它,但无法。另外,如果你可以给我一个关于它如何工作的细分......因为在我的脑海里它(int)3/2 =(int)1,然后浮点值应该是1.000000 –

+1

什么使你相信它**应该是1.000? 'printf()'不是魔术。它完全知道你所传递的表达式的类型(这就是为什么你必须使用格式化字符串)。这不是魔术。但阅读接受的答案,你会知道。 – 2013-10-20 09:54:56

回答

5

您会得到一个混合的未转换的字节(您传递的整数)&瞬时数据从堆栈中移出,格式化为浮点数。 @ H2CO3给了很好的参考。

这是因为您正在传递一个int,但您已告知printf()预期浮点值(特别是双精度值)。如果你使用%f作为格式,你需要传递一个double。如果不这样做,会导致未定义的&错误地访问堆栈上的未定义/垃圾值。

两个操作数整数3/2将执行整数除法。使一个或两个操作数加倍,即3.0/2,并且您将拥有浮点除法& printf()将按照您的预期运行。

相关问题