printf("%f",10/3); 答案是多少?

gongyue1983 2009-03-05 10:36:44
加精
printf("%f",10/3); 答案是多少?

结果为什么是:0.000000
...全文
42116 1064 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1064 条回复
切换为时间正序
请发表友善的回复…
发表回复
qin_pp 2012-10-28
  • 打赏
  • 举报
回复
float f= 10/3;
printf("%f",f);
这样做的结果变成了3.000000,printf函数采用的控制台输出,所以,参数必须有一个明确的地址,这样才能通过控制台调用地址将其输出,仅仅使用printf("%f“,10/3)并没有地址分配,所以就出现报错或者是算错
  • 打赏
  • 举报
回复
41楼正解,该代码生成的汇编里面也可以看出来
此账号已停用 2012-10-26
  • 打赏
  • 举报
回复

你的程序代码是这样的吗?
#include <stdio.h>
#include <string.h>
int main()
{
printf("%f",10/3);

return 0;
}
这样输出的结果是0.00000,

如果是这样的:
#include <stdio.h>
#include <string.h>
int main()
{
printf("%f",double(10/3));
return 0;
}
上面这样输出的结果是3.333333
因为10/3是整型的,而%f是浮点型的,以这种形式输出只能是0.00000!系统只能这样输出!
夏天__ 2012-10-11
  • 打赏
  • 举报
回复
linux下运行结果:

[root@bogon temp]# cat t1.c
#include <stdlib.h>
#include <string.h>
#include <stdio.h>

int main()
{
printf("%f\n",10/3);
printf("%f\n",3);
printf("%d\n",10/3);
printf("%f\n",10/3);
printf("%f\n",(double)10/3);
printf("%f\n",10/3);
printf("%f\n",10/3);
}
[root@bogon temp]# ./t1
0.000000
0.000000
3
0.000000
3.333333
3.333332
3.333332
[root@bogon temp]#
xiangzhanyou 2012-10-11
  • 打赏
  • 举报
回复
10.0/3.0
Lin_Aixiao 2012-10-08
  • 打赏
  • 举报
回复
使用格式指定符%f显示浮点数,格式指定符一般要对应输出值的类型,10/3中10与3都是int类型,所以其结果应为3,又3是int类型与%f不对应,所以得到了一个垃圾值。修改方法:printf("%f",(float)10/3);
didijiji 2012-10-07
  • 打赏
  • 举报
回复
怎么还没结贴???
lzh8430 2012-10-06
  • 打赏
  • 举报
回复
学习了
idy 2012-10-05
  • 打赏
  • 举报
回复
受益匪浅啊
wCOREz 2012-10-05
  • 打赏
  • 举报
回复
[Quote=引用 41 楼 的回复:]

调用函数printf压栈为先压3(这里10 / 3在编译阶段直接evaluate得3),再压format string,由于是“%f”,所以它期待一个double,然后就将3(int)及附近的内存和起来当double去解释(因为int为4bytes,而double为8bytes,故而要联合周围的内存),至于解释成什么了,就看你周围内存什么样了,起码在我的机器上由于无法解释而导致异常(解释规则IE……
[/Quote]

很好很强大啊!学习了
qian1246131605 2012-09-23
  • 打赏
  • 举报
回复
先顶了吧
sunchaosailor 2012-09-23
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 的回复:]

原因在于printf,printf不会关心你输入的参数的类型,你输入的实际是
printf("%f",3),但是这个整型3不会被隐式类型转换为浮点型,而是被直接按内存内容当作浮点型

也就是说,内部使用等价于
int i = 3;
printf("%f", *(float*)&i)

不幸的是,整型3在内存布局上如果看成浮点数,它就是接近于0

这是不定参数的特点,没有……
[/Quote]

10楼所言,甚得之!
niuweixing007 2012-09-05
  • 打赏
  • 举报
回复
你的那个10 是编译器作为整形 int考虑的,这之间是要考虑类型转换的。
SharerMax 2012-09-01
  • 打赏
  • 举报
回复
10/3的结果默认是int(整形),而你输出的是%f 即float(单精度浮点类型),float数据在内存中存储数据的空间大小不一,float要大于int,这就造成数据丢失的情况,所以会出现那样的结果!
xcszbdnl 2012-09-01
  • 打赏
  • 举报
回复
推荐看《深入理解计算机系统》。10/3是一个整形数,而%d,%f分别是格式控制符,用来说明位模式如何解释,10/3相当于3。3在32位计算机中表示为0000....0011。而浮点数32位的小数字段为后23位,阶码为23-30,31位为符号数,则此数为非规格化数,阶码为-126,则此数解释为1*(2^-126)*(2^-22+2^-23)这么小,应为%f只输出后6位,则肯定输出为0.000000
把握 2012-08-31
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]
%f 表示输出格式为double类型,10/3表示是为整型,系统输出时有发生类型转换

C/C++ code

#include <stdio.h>
#include <string.h>

int main()
{
printf("%f",(double)10/3);

return 0;
}
[/Quote]赞同
淡定的小Y 2012-08-30
  • 打赏
  • 举报
回复
3.000000
LookIn 2012-08-30
  • 打赏
  • 举报
回复
g++编译时给的警告: 格式 ‘%f’ expects argument of type ‘double’, but argument 2 has type ‘int’ [-Wformat]
xxnn888 2012-08-14
  • 打赏
  • 举报
回复
[Quote=引用 56 楼 的回复:]
引用 10 楼 arong1234 的回复:
原因在于printf,printf不会关心你输入的参数的类型,你输入的实际是
printf("%f",3),但是这个整型3不会被隐式类型转换为浮点型,而是被直接按内存内容当作浮点型

也就是说,内部使用等价于
int i = 3;
printf("%f", *(float*)&i)

不幸的是,整型3在内存布局上如果看成浮点数,……
[/Quote]

感觉这个回复比较合理
  • 打赏
  • 举报
回复
printf("the 10.0/3 is %f\n",10.0/3);
printf("the 10/3 is %f\n",10/3);
printf("the (float)10.0/3 is %f\n",(float)10.0/3);

显示的结果是 3.333333 0.000000 3.333333
加载更多回复(1045)

69,335

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧