本帖最后由 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

求达人解释为什么。。
共收到 4 条回复
inccinf · #2 · 2013-3-19 22:20:45  回复 支持 反对
在你没有INCLUDE头文件的时候,编译器不知道你的函数原型,在生成目标文件时会进行参数推断,就是根据你调用的情况进行推断,仅推断参数个数,参数数据类型会一律推断为INT型,之后生成二进制可执行文件时,链接器在环境变量指定的目录或者当前目录下寻找到匹配的函数定义,进行链接,但是之前的MAIN目标文件已经按照INT型进行参数推断了,所以数据会按照INT型进行存储和传递,最后真正执行时调用printf对一个INT型存储的数据按照FLOAT型进行输出,结果是不可预估的。

点评

呃,大神呃,我懂了,但是还有个问题,我把类型换成double,不加头文件,为什么输出也是正常的呢,按照你的解释,对一个int型存储的数据按照float进行输出,结果应该也是不可预估的啊,求指导  详情 回复 发表于 2013-3-22 16:48

评分

参与人数 1学分 +12 收起 理由
admin + 12

查看全部评分

maxOrder石 · #3 · 2013-3-19 23:05:12  回复 支持 反对
学习一楼了,碉堡了
HappyBarry · #4 · 2013-3-22 16:48:13  回复 支持 反对
inccinf 发表于 2013-3-19 22:20
在你没有INCLUDE头文件的时候,编译器不知道你的函数原型,在生成目标文件时会进行参数推断,就是根据你调用 ...

呃,大神呃,我懂了,但是还有个问题,我把类型换成double,不加头文件,为什么输出也是正常的呢,按照你的解释,对一个int型存储的数据按照double进行输出,结果应该也是不可预估的啊,求指导

点评

呃,了解了,自己试验了下,如果参数是3.0,double型输出就没问题,如果参数是3,double型输出就会有问题,输出了0.00000。所以没有头文件的时候,编译器除了根据参数推断参数的个数,还会推断参数的类型,不过浮点型  详情 回复 发表于 2013-3-22 16:57
HappyBarry · #5 · 2013-3-22 16:57:46  回复 支持 反对
HappyBarry 发表于 2013-3-22 16:48
呃,大神呃,我懂了,但是还有个问题,我把类型换成double,不加头文件,为什么输出也是正常的呢,按照你 ...

呃,了解了,自己试验了下,如果参数是3.0,double型输出就没问题,如果参数是3,double型输出就会有问题,输出了0.00000。所以没有头文件的时候,编译器除了根据参数推断参数的个数,还会推断参数的类型,不过浮点型数据会默认为double型,而不是float型。。。
测试了下,即使参数是3.0f,编译器也还是会判断为double。。。不认作float。。。
所以为了避免这种问题,最好加上头文件,或者使用double类型
回帖
B Color Image Link Quote Code Smilies
Command + Enter
快速回复 返回顶部 返回列表