关于C语言中printf函数的一个问题
2008-08-19 10:55
477 查看
对于下面的程序,我用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()函数关于不能打印字符的问题
- 关于对象在函数中delete的一个问题
- 关于自学C语言的一个问题
- 关于EL自定义函数和如果其中参数是一个自定义的类的问题
- 关于函数实现在头文件(.h)中造成的一个问题
- C语言学习4: 函数返回值与传入参数,关于函数值传递和类型隐性转换,变量不同的作用域,static变量,多文件编译例如两个C文件,显示函数调用语句跳转,递归,斐波那契数列,多文件编译相同变量的问题。
- 关于strlen函数的一个问题
- 一个关于含有显式实参的虚函数调用问题解释
- c语言中函数的嵌套调用(关于函数声明的一个例子)
- 一个关于linux进程函数kill的问题
- STM32中关于串口通信的printf()函数重定向问题
- 一个关于C语言输入的问题
- 01 [c语言][重要的知识点]printf函数和scanf函数的数据输出与读取问题
- 同一个C语言工程不同C文件之间的函数互相调用问题(二)
- C语言中的一个关于基本类型的输出问题
- C语言中的scanf和printf函数的返回值问题
- 关于strlen函数的一个问题
- 关于printf函数的返回值问题
- 关于c语言中printf的几个问题