为什么 printf(“%d“, 5/2) 输出 2 不是 2.5?C语言整数除法陷阱

为什么 printf(“%d”, 5/2) 输出 2 不是 2.5?C语言的整数除法陷阱

你有没有遇到过这种情况?

#include<stdio.h>intmain(){printf("%d\n",5/2);// 输出 2,不是 2.5!printf("%d\n",10/3);// 输出 3,不是 3.333...printf("%d\n",1/2);// 输出 0!return0;}

很多人刚开始学 C 语言,看到1 / 2 = 0整个人都懵了——哪怕是小学数学也知道一除以二等于零点五啊。

但这个结果不是 bug,是 C 语言设计者有意为之的「整数除法」。今天 3 分钟彻底搞懂。


一句话结论:整数 / 整数 = 整数,小数部分直接被丢弃

C 语言里,两个整数相除,结果一定是整数。计算过程是:

5 / 2 = 2.5 → 去掉小数 → 2 10 / 3 = 3.333... → 去掉小数 → 3 1 / 2 = 0.5 → 去掉小数 → 0

不是四舍五入,是直接截断(truncation),一刀切掉小数部分。


画个图就清楚了

5 / 2 的计算过程: ┌───┬───┬───┬───┬───┐ │ 1 │ 2 │ 3 │ 4 │ 5 │ 5 个苹果 └───┴───┴───┴───┴───┘ 每 2 个一组: ┌───┬───┐ ┌───┬───┐ ┌───┐ │ 1 │ 2 │ │ 3 │ 4 │ │ 5 │ ← 剩下的 1 个不够一组 └───┴───┘ └───┴───┘ └───┘ 第1组 第2组 被丢弃 结果 = 2(组数),不是 2.5

那我想得到 2.5 怎么办?

// 方法一:把其中一个操作数变成浮点数printf("%f\n",5.0/2);// 2.500000printf("%f\n",5/2.0);// 2.500000// 方法二:强制类型转换printf("%f\n",(double)5/2);// 2.500000// 方法三:两个都转printf("%f\n",5.0/2.0);// 2.500000

只要除法表达式里有一个是浮点数,C 语言就会自动做浮点除法。


这个坑不止在输出时

doubleresult=5/2;// result = 2.0,不是 2.5!printf("%f\n",result);// 输出 2.000000

为什么?因为5 / 2先算(整数除法得 2),然后才把 2 转成 double 赋值。转换发生在除法之后,太迟了。

正确写法:

doubleresult=5.0/2;// result = 2.5// 或者doubleresult=(double)5/2;// result = 2.5

一张表记住

表达式结果原因
5 / 22整数除法,截断
5.0 / 22.5浮点除法
5 / 2.02.5浮点除法
5.0 / 2.02.5浮点除法
1 / 20最容易踩的坑
(double)5 / 22.5显式类型转换
double x = 5/22.0先整除再赋值,来不及

记住一句话

C 语言里两个整数相除,小数部分会被直接丢弃,不是四舍五入。想要小数结果,至少让一个操作数变成浮点数。

理解了这条规则,你也就明白了为什么1 / 2等于 0——不是数学错了,是类型决定了计算方式。

你还被哪些反直觉的 C 语言结果坑过?评论区聊聊。

#c语言 #算法 #数据结构