关于C语言中printf函数的一个问题
来源:互联网 发布:知乎冷启动 编辑:程序博客网 时间:2024/05/17 09:23
对于下面的程序,我用VS2003运行的结果第一个是0,第二个是一个很大的数。
#include <stdio.h>
int main()
{
printf("%f",5); //line 1
printf("%d",5.01); //line 2
}
具体原因在论坛上提问后得到结果。引用答案如下
关键你要理解浮点数的存储格式!
printf("%f",5); //line 1
5在内存中是 0x00 00 00 05,按照float格式解释是一个无限接近于0的浮点数数
printf("%d",5.01); //line 2
5.01按照整数去解释,这个数应该是一个非常大的整数
帮1楼补充几句:
这是printf可变参数不做类型检查引起的。
int printf(const char *format, ...);
printf("%f",5); //line 1
编译器在给printf传参的时候,不知道这个5应该传什么类型,所以只能按1楼所说整数的格式传进去。在printf里面使用这个参数的时候却是按照"%f"的要求解释成了浮点数。
前面的"%f"对编译器来说就是一个普通字符串而已,编译器不懂printf的格式。
所以可变参数的函数是很危险的,尽量少用。
如果是一个普通的函数,编译器就会根据函数原型,在传参的时候自动做类型转换。
比如
void foo(float f);
......
foo(5);
在这里编译器知道foo需要一个浮点数,事先就会把5转换成浮点数的格式传进去。
#include <stdio.h>
int main()
{
printf("%f",5); //line 1
printf("%d",5.01); //line 2
}
具体原因在论坛上提问后得到结果。引用答案如下
关键你要理解浮点数的存储格式!
printf("%f",5); //line 1
5在内存中是 0x00 00 00 05,按照float格式解释是一个无限接近于0的浮点数数
printf("%d",5.01); //line 2
5.01按照整数去解释,这个数应该是一个非常大的整数
帮1楼补充几句:
这是printf可变参数不做类型检查引起的。
int printf(const char *format, ...);
printf("%f",5); //line 1
编译器在给printf传参的时候,不知道这个5应该传什么类型,所以只能按1楼所说整数的格式传进去。在printf里面使用这个参数的时候却是按照"%f"的要求解释成了浮点数。
前面的"%f"对编译器来说就是一个普通字符串而已,编译器不懂printf的格式。
所以可变参数的函数是很危险的,尽量少用。
如果是一个普通的函数,编译器就会根据函数原型,在传参的时候自动做类型转换。
比如
void foo(float f);
......
foo(5);
在这里编译器知道foo需要一个浮点数,事先就会把5转换成浮点数的格式传进去。
- 关于C语言中printf函数的一个问题
- 关于C语言中printf函数的参数执行顺序
- c语言的printf一个小问题
- 关于c语言的printf()问题
- 关于c语言中printf的几个问题
- C语言中Printf()函数的运行机制
- 关于C语言中printf()变量++/--输出值得注意的问题
- 关于C语言中printf输出字符串的问题!字符串须以'\0'作为结尾。
- 关于C语言中printf()后的scanf()不执行问题,解决方法
- c语言中可变参数的原理---printf()函数
- c语言中可变参数的原理---printf()函数
- 对c语言中printf函数的个人理解
- C语言printf()函数中一些不为人知的技巧!
- C语言printf()函数中一些不为人知的技巧!
- 语法:C语言中printf函数的返回值
- C 语言中的 printf 函数问题
- C语言中scanf()和printf()的返回值问题
- C语言中printf格式化输出函数
- RPM
- 奶奶个熊
- struts中使用 FormFile接口实现上传
- 详解程序死循环
- 大部分网站的session的处理
- 关于C语言中printf函数的一个问题
- 源码分析
- Spring Security-2.0.x参考文档CAS认证
- RHCE笔记
- JSP内置对象
- Base64介绍
- 剖析CAS Proxy的设计原理
- 深入继承 - 抽象类和接口
- CronTrigger具体运用方式