编程中发现
float
类型数据在跨文件的值调用中会发生异常。举例如下:
test.c
void a(float x1) {
printf("%f", x1);
}
void b(float x1) {
a(x1);
}
main.c
#include <stdio.h>
int main(){
b(3.3);
}
运行输出结果是一个奇大无比的数字
若新建头文件test.h,在头文件中声明一下这两个函数
void a(float x1);
void b(float x1);
在main.c中#include "test.h"
在运行发现输出恢复正常。得到3.30000
原因:
在你没有INCLUDE头文件的时候,编译器不知道你的函数原型,在生成目标文件时会进行参数推断,就是根据你调用的情况进行推断,仅推断参数个数,参数数据类型会一律推断为INT型,之后生成二进制可执行文件时,链接器在环境变量指定的目录或者当前目录下寻找到匹配的函数定义,进行链接,但是之前的MAIN目标文件已经按照INT型进行参数推断了,所以数据会按照INT型进行存储和传递,最后真正执行时调用printf对一个INT型存储的数据按照FLOAT型进行输出,结果是不可预估的。
自己试验了下,如果参数是3.0,double型输出就没问题,如果参数是3,double型输出就会有问题,输出了0.00000。所以没有头文件的时候,编译器除了根据参数推断参数的个数,还会推断参数的类型,不过浮点型数据会默认为double型,而不是float型。。。
测试了下,即使参数是3.0f,编译器也还是会判断为double。。。不认作float。。。
所以为了避免这种问题,最好加上头文件,或者使用double类型