如果用两个 int 类型的变量 a 和 b 分别表达平行四边形的两条边长,用 int 类型的变量 h 表达 a 边对应的高,则下列哪个表达式不能用来计算 b 边对应的高?( )
这道题考的是整数除法会截断小数,而浮点除法能保留精度。拿到题先别急着套公式,盯着运算顺序看:只要乘法链里混进一个浮点数,整个式子就会按浮点算;若整数除法先发生,精度就丢了。
很多考生只背面积公式,觉得数学上 a/h/b 和 (a*h)/b 等价,就选 A。其实 C++ 里整数除法会直接丢弃小数部分,一旦 a/b 先算,后面乘 h 也救不回来。另外,加 0.0 的位置很关键,必须让 0.0 参与乘法运算才能触发类型提升,只加在单个变量上没用。还有 bool 转 int 的陷阱,关系表达式结果为 0 或 1,别误以为它是真值参与运算。
考点与概念 本题考查 GESP 二级算法基础模块中的数据类型与表达式计算。核心概念是:C++ 中整数除法会直接截断小数部分,而浮点除法能保留精度。当表达式中同时存在整数和浮点数时,会发生隐式类型转换,向更高精度提升(int→float→double)。命题人专门设计此题卡住 80% 考生的弱点——对整数除法截断效应的忽视。许多考生只背公式 h_b = (a×h)/b,却不知在 C++ 中 int/int 运算会直接丢弃小数部分,必须强制转换成浮点运算。
解题思维与计算过程 面积公式 a×h = b×h_b 在数学上不变,但代码实现时,若 h_b = (a×h)/b 中三个变量都是 int,运算顺序至关重要。正确做法是让运算链中至少一处出现浮点:加 0.0 即可触发类型提升。对比四选项:
陷阱拆解 选项 A 的陷阱在于“乘除同级从左到右”——先 a/b 截断,再乘以 h,看似数学上等价,实则 C++ 里运算顺序不可随意交换。命题人利用考生“公式等价即代码可互换”的错觉,在看似无害的加 0.0 位置设伏:B、C、D 的 0.0 都落在乘法链里,强制整体浮点;A 的 0.0 包在 h 上,只影响 h 本身,挡不住 a/b 先被截断。只背结论、不读表达式结构的人必掉坑。
反命题思维 若把题目改成“下列哪个一定能正确计算 h_b?”答案就变成 B/C/D 全选。这提示你:刷到类似题先问“命题人想考我什么”——是考公式记忆,还是考类型转换细节?这道题要的就是后者,别被数学等式骗了。
考频与趋势 “运算符与表达式”考点在题库中高频出现,2023 年考了 91 题,2024 年 41 题,2025 年 61 题,2026 年 14 题,呈逐年上升趋势。其中 GESP 二级占比最高(70 题),其次是 GESP 一级(72 题)和 GESP 三级(47 题)。这表明 GESP 二级考生需重点掌握类型转换与运算顺序。
预测 基于数据,未来 GESP 二级仍会高频考查整数除法陷阱与浮点提升细节,可能以选择题形式出现,也可能结合简单计算题考察表达式求值顺序。暂无足够依据预测是否会引入新的语言特性(如 C++20 的三向比较运算符),但整数除法截断仍是必考核心。