本帖最后由 HappyBarry 于 2013-3-19 21:58 编辑 编程中发现float类型数据在跨文件的值调用中会发生异常。举例如下: test.c[C] 纯文本查看 复制代码 void a(float x1) { printf("%f", x1); } void b(float x1) { a(x1); } main.c [C] 纯文本查看 复制代码 #include <stdio.h> int main(){ b(3.3); } 运行输出结果如下 若新建头文件test.h,在头文件中声明一下这两个函数 [C] 纯文本查看 复制代码 void a(float x1); void b(float x1); 在main.c中#include "test.h" 在运行发现输出恢复正常。得到3.30000 求达人解释为什么。。 |
[技术| 编程·课件·Linux] float类型在值传递过程中出现的问题
HappyBarry
· 发布于 2013-03-19 21:55
· 1291 次阅读
转载文章时务必注明原作者及原始链接,并注明「发表于 软院网 RuanYuan.Net 」,并不得对作品进行修改。
在你没有INCLUDE头文件的时候,编译器不知道你的函数原型,在生成目标文件时会进行参数推断,就是根据你调用的情况进行推断,仅推断参数个数,参数数据类型会一律推断为INT型,之后生成二进制可执行文件时,链接器在环境变量指定的目录或者当前目录下寻找到匹配的函数定义,进行链接,但是之前的MAIN目标文件已经按照INT型进行参数推断了,所以数据会按照INT型进行存储和传递,最后真正执行时调用printf对一个INT型存储的数据按照FLOAT型进行输出,结果是不可预估的。 |
点评
评分
呃,大神呃,我懂了,但是还有个问题,我把类型换成double,不加头文件,为什么输出也是正常的呢,按照你的解释,对一个int型存储的数据按照double进行输出,结果应该也是不可预估的啊,求指导 |
点评
呃,了解了,自己试验了下,如果参数是3.0,double型输出就没问题,如果参数是3,double型输出就会有问题,输出了0.00000。所以没有头文件的时候,编译器除了根据参数推断参数的个数,还会推断参数的类型,不过浮点型数据会默认为double型,而不是float型。。。 测试了下,即使参数是3.0f,编译器也还是会判断为double。。。不认作float。。。 所以为了避免这种问题,最好加上头文件,或者使用double类型 |