程序员 · 高频练习

C语言中7/2为什么不是3.5,强制转换应该放在哪里?

初级 单选题 第 1130 题 较难 程序员C语言整数除法强制类型转换浮点运算
题目

在C语言中,若希望变量x得到3.5,下列写法正确的是()。

A double x = 7 / 2;
B double x = (double)(7 / 2);
C int x = 7.0 / 2;
D double x = (double)7 / 2;
题目类型:原创高频练习题 用途:用于帮助理解程序员相关考点和答案解析,不等同于官方真题。
正确答案
D
答案解析

除法执行时先根据操作数类型决定运算方式。7和2都是int,7/2先得到整数3,之后再赋给double只能变成3.0;把整个7/2的结果强转也来不及。选项D在除法前把7转换为double,另一个操作数随通常算术转换参与浮点除法,结果才是3.5。

选项分析

A

错误。先做整数除法得到3,再转换为3.0。

B

错误。括号内整数除法已经丢失小数,事后转换无法恢复。

C

错误。右侧是浮点除法,但赋给int时小数部分被舍去。

D

正确。除法前至少一个操作数为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。