为什么 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 / 2 | 2 | 整数除法,截断 |
5.0 / 2 | 2.5 | 浮点除法 |
5 / 2.0 | 2.5 | 浮点除法 |
5.0 / 2.0 | 2.5 | 浮点除法 |
1 / 2 | 0 | 最容易踩的坑 |
(double)5 / 2 | 2.5 | 显式类型转换 |
double x = 5/2 | 2.0 | 先整除再赋值,来不及 |
记住一句话
C 语言里两个整数相除,小数部分会被直接丢弃,不是四舍五入。想要小数结果,至少让一个操作数变成浮点数。
理解了这条规则,你也就明白了为什么1 / 2等于 0——不是数学错了,是类型决定了计算方式。
你还被哪些反直觉的 C 语言结果坑过?评论区聊聊。
#c语言 #算法 #数据结构