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

C语言中printf用%f输出9/5为何打印垃圾值而非1.8?

问题原因
  • C语言中,当/运算符的两个操作数都是整型时,执行的是整型截断除法:运算结果会直接舍弃小数部分,类型为整型。你代码里的9和5都是int类型的字面量,因此9/5的实际运算结果是int类型的1,根本不会生成你预期的浮点值1.8。
  • printf是可变参数函数,它不会在运行时自动校验传入参数的实际类型,只会完全按照格式符指定的类型、长度去读取参数对应的内存数据:
    • 用%d时,它会读取对应位置上int长度的内存块,和你传入的int类型值1完全匹配,因此可以正确输出1。
    • 用%f时,它预期读取一个double类型的值(可变参数传递时float会自动提升为double,占8字节内存),但你实际传入的是4字节(32位环境下)的int值,二者的内存长度、二进制存储规则完全不匹配,读出来的自然是无意义的垃圾值。

注意:格式符与传入参数类型不匹配属于C语言标准定义的未定义行为,输出垃圾值只是常见表现之一,极端情况下还可能导致程序崩溃。

修复方案

只需要把/运算的任意一个操作数转为浮点类型,就会触发浮点除法,得到你要的1.8结果,参考代码如下:

#include <stdio.h>
int main() {
    // 写法1:把其中一个操作数写为浮点字面量
    printf("%f", 9.0 / 5);
    // 写法2:显式做类型转换
    // printf("%f", (double)9 / 5);

    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 14:21:07