C语言程序异常:5/9第5行打印1.799999而非预期0.000000
问题原因分析
首先明确核心问题:你的代码触发了C语言的未定义行为,根源是printf的格式符和传入参数的类型不匹配。
关键细节拆解
5/9是整数除法:因为两个操作数都是int类型,整数除法会直接截断小数部分,结果是0(int类型)。- 第一个
printf("%f\n",5/9)输出0.000000:%f格式符要求传入double类型参数,但你传了int类型的0。在当前环境的函数调用栈布局下,这个int类型的0刚好被解析成了浮点型的0.0,这是巧合。 - 第三个
printf("%f\n",5/9)输出1.799999:第二个printf传入的是double类型的1.8(9.0/5.0的结果是double),调用结束后栈上残留了这个浮点值的部分数据。第三个printf依然用%f读取栈,但你传的int类型0并没有覆盖掉之前的残留数据,导致它错误解析出了接近1.8的数值——这就是未定义行为的典型表现:结果完全不可控,换个环境可能输出其他奇怪的值。
正确写法
要输出5/9的浮点结果,需要把操作数转为浮点类型,让除法变成浮点除法:
#include<stdio.h> int main(){ printf("%f\n", 5.0/9); // 用浮点操作数,结果是double,匹配%f printf("%f\n", 9.0/5.0); printf("%f\n", (double)5/9); // 强制类型转换,同样得到浮点结果 }
内容的提问来源于stack exchange,提问作者Jim Stone
相关产品推荐
相关产品推荐

