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
相关产品推荐
相关产品推荐

