float类型在值传递过程中出现的问题

编程中发现 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类型

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值