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

为什么 printf(“%d“, 5/2) 输出 2 不是 2.5?C语言整数除法陷阱
为什么 printf(“%d”, 5/2) 输出 2 不是 2.5C语言的整数除法陷阱你有没有遇到过这种情况#includestdio.hintmain(){printf(%d\n,5/2);// 输出 2不是 2.5printf(%d\n,10/3);// 输出 3不是 3.333...printf(%d\n,1/2);// 输出 0return0;}很多人刚开始学 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 语言就会自动做浮点除法。这个坑不止在输出时doubleresult5/2;// result 2.0不是 2.5printf(%f\n,result);// 输出 2.000000为什么因为5 / 2先算整数除法得 2然后才把 2 转成 double 赋值。转换发生在除法之后太迟了。正确写法doubleresult5.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语言 #算法 #数据结构