您的位置:首页 > 其它

有关printf输出的问题

2009-08-29 11:52 453 查看
问题是:
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: