有关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
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
相关文章推荐
- 【疑问】有关C语言中printf函数的输出和格式的问题
- 格式化输入输出浮点数据的细微问题(C标准:printf,scanf)
- 有关fastjson输出的时候double不输出后面.0的问题
- printf()输出缓存问题
- Mybatis 的Log4j日志输出问题 - 以及有关日志的所有问题
- Mybatis 的Log4j日志输出问题 - 以及有关日志的所有问题
- keil中printf的有关问题
- 控制台程序的中文输出乱码问题,printf,wprintf与setlocale
- fork()引起的printf()输出多次的问题
- 小问题:linux下printf中标准输出显示问题
- Mybatis 的Log4j日志输出问题 - 以及有关日志的所有问题
- 【C/C++】Linux C,关于刷新printf输出问题
- 遇到printf输出问题
- cout,wcout,printf,wprintf等函数的中文输出问题
- 有关va_list和vsnprintf输出函数的问题
- 01 [c语言][重要的知识点]printf函数和scanf函数的数据输出与读取问题
- 关于printf输出结果的一些问题
- 有关printf的小问题
- 相对printf(),对于多线程的cout<<输出乱码的问题
- C中printf循环输出不及时显示的问题