You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何该C语言程序输出0?使用%f为何未实现int转float?

问题分析:printf用%f输出int值出现错误的原因

先看问题中的代码:

#include<stdio.h>

int sum(int, int);

int main()
{
    printf("%f", sum(2, 4));
    return 0;
}

int sum(int a, int b){
    int c = a + b;
    return c;
}

为什么输出结果是0?

  • printf是可变参数函数,它不会校验传入参数和格式符的类型匹配关系,完全按照你指定的格式符去解析栈上的参数。
  • 以32位系统为例,int类型的6占4字节,存储为0x00000006;而%f会让printf读取8字节的double类型数据。当printf用浮点数格式解析这4字节的整数数据时,剩下的4字节是栈中的随机值,组合后的8字节数据对应到浮点数格式里,是一个极小的非规格化数,最终打印出来就是0.000000。

为什么%f不能自动把int转换成float?

  • 可变参数的参数传递有默认提升规则:char、short会提升为int,float会提升为double,但这个提升是在参数传入printf之前完成的,不是printf根据格式符去做转换。
  • 这里传入的是int类型的6,没有规则会自动将它转为float或double。printf拿到的就是int类型的参数,但%f要求的是double类型,类型不匹配直接导致解析错误,不存在“自动转换”的环节——printf根本不知道你传入的参数类型,只会严格按格式符的要求去读数据。

内容的提问来源于stack exchange,提问作者Cryogen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 19:12:39