有关printf输出的问题

问题是:
printf("%f",10/3);
结果是多少?

其结果并非唯一且固定.我在vc中运行,其结果是-1.#QNAN0,表示越界.但有的朋友运行结果却是0.000000.甚至有些朋友运行出了不断变化的结果.赫赫,对这个语句的输出结果是什么,我们不用花太多时间去讨论,下面,我们就该语句的正确写法做以简单描述.

 

作者的本意应该是要输出10/3的浮点数结果,即3.333333.那么,上面的语句可以按照以下几种方式去做修改.
1.printf("%f",(float)10/3);
2.printf("%f",(double)10/3);
3.printf("%f",10/(float)3);
4.printf("%f",10/(double)3);
5.printf("%f",10.0/3);
6.printf("%f",10/3.0);
这六种书写方式下,其运行结果都是3.000000.

注意,如果写成了如下两种方式:
1.printf("%f",(float)(10/3));
2.printf("%f",(double)(10/3));
其运行结果将会是3.000000.因为10/3的结果被隐式转换为int类型,即其为3.

 

至此,我们知道了所提问题的错误所在,也知道其修改方式.但是,问题中的语句为什么会输出那样的结果,这个问题好像还是值得继续研究的.下面我们一起来讨论.

 

printf("%f",10/3); 相当于是printf("%f",3);在调用函数printf时,首先它会将int类型的4压栈,再压format string,由于是"%f",所以它期待一个double类型的数据.int为4个byte,double为8个byte.当按%f输出时,它需要8个byte,这时会将int类型的3及其周围的4个未知byte一起弹出栈,由于那4个未知byte,就可能出现不同的结果.或者出现异常,或者越界,或者是0.000000,或者是其他不确定的数据.原因就这么简单,赫赫.

 

此文是对下面的帖子的一个小小的总结,感兴趣的朋友可以再去阅读该帖子.
http://topic.csdn.net/u/20090305/22/6365501d-844e-4fd4-9905-ac1c703ba05a.html?46788


 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值