在C语言中,若希望变量x得到3.5,下列写法正确的是()。
除法执行时先根据操作数类型决定运算方式。7和2都是int,7/2先得到整数3,之后再赋给double只能变成3.0;把整个7/2的结果强转也来不及。选项D在除法前把7转换为double,另一个操作数随通常算术转换参与浮点除法,结果才是3.5。
选项分析
错误。先做整数除法得到3,再转换为3.0。
错误。括号内整数除法已经丢失小数,事后转换无法恢复。
错误。右侧是浮点除法,但赋给int时小数部分被舍去。
正确。除法前至少一个操作数为double,结果为3.5。
本题为什么容易错
很多同学误以为左侧变量是double,右侧就会自动保留小数。表达式求值和赋值是两个阶段,右侧先独立算完,这正是题目的判断入口。
简短答案
C语言中7/2为什么不是3.5,强制转换应该放在哪里,正确答案是 D(double x = (double)7 / 2;)。除法执行时先根据操作数类型决定运算方式。7和2都是int,7/2先得到整数3,之后再赋给double只能变成3.0;把整个7/2的结果强转也来不及。选项D在除法前把7转换为double,另一个操作数随通常算术转换参与浮点除法,结果才是3.5。
易混淆概念对比表
| 概念 | 本题判断 | 区别要点 | 记忆提示 |
|---|---|---|---|
| double x = 7 / 2; | 本题干扰项 | 错误。先做整数除法得到3,再转换为3.0。 | 看到该词不要急着选,先判断是否真正解决题干问题 |
| double x = (double)(7 / 2); | 本题干扰项 | 错误。括号内整数除法已经丢失小数,事后转换无法恢复。 | 看到该词不要急着选,先判断是否真正解决题干问题 |
| int x = 7.0 / 2; | 本题干扰项 | 错误。右侧是浮点除法,但赋给int时小数部分被舍去。 | 看到该词不要急着选,先判断是否真正解决题干问题 |
| double x = (double)7 / 2; | 本题正确答案 | 正确。除法前至少一个操作数为double,结果为3.5。 | 看到题干核心场景时优先联想到它 |
本题易混淆选项怎么区分
- double x = 7 / 2;:错误。先做整数除法得到3,再转换为3.0。
- double x = (double)(7 / 2);:错误。括号内整数除法已经丢失小数,事后转换无法恢复。
- int x = 7.0 / 2;:错误。右侧是浮点除法,但赋给int时小数部分被舍去。
知识点详解
C语言中两个整数操作数执行整数除法,结果舍去小数部分;若至少一个操作数是浮点类型,另一个会进行相应转换后执行浮点除法。赋值转换发生在表达式结果产生之后。
备考速记
小数要在除法前进场,算完再换衣服已经晚了。
C语言 在浮点运算场景中的作用
计算平均值时,sum和count若都是int,可写成(double)sum/count。若先写sum/count再转换,平均值的小数部分已经丢失。
同类题怎么考
- 判断整数除法赋给浮点变量后的结果。
- 选择能保留小数的类型转换位置。
C语言 在程序员软考中的考法
先圈出运算符的直接操作数类型,再看外层转换和赋值。按由内到外的顺序判断,不要被左侧声明带偏。
解题思路
别先看左边的double,先看除号两边。A和B的7/2都已经按整数算完;C虽算出3.5,却又存进int被截断。只有D让除法本身按浮点规则执行。
考点定位
类型转换发生在运算前还是运算后,会改变结果。目标变量是double,并不会倒推右侧表达式改用浮点除法。
易错提醒
- 把强制转换写在整个整数表达式外面。
- 使用整数接收浮点运算结果。
- 在实际金额计算中直接依赖二进制浮点精确表示十进制小数。
备考提示
- 把A、B、C、D放进一个小程序打印结果,观察转换位置的影响。
- 在书木兰软考题库 https://www.shumulan.com/ 练运算符题时,可把“运算前类型”和“结果接收类型”分成两列检查。
你可能还想了解
- C语言7/2为什么等于3?
- 怎样让两个整数相除得到小数?
- 强制转换应写在除法前还是后?
本文小结
C语言中7/2先执行整数除法得到3;要获得3.5,应在除法前将至少一个操作数转换为double。