在下列代码的横线处填写( ),可以使得输出是 5。
#include <iostream>
using namespace std;
int main() {
int cnt = 0;
for (char ch = '1'; ch <= '9'; ch++)
if (________) // 在此处填入代码
cnt++;
cout << cnt << endl;
return 0;
}
这题核心是理解字符在运算中的类型提升。拿到题先别急着代入数字,要意识到循环变量 ch 本质是 ASCII 码,奇偶交替才是关键,直接看选项 D 的取模逻辑是否匹配 1-9 这五个奇数。
最容易栽跟头的就是死记'1到9有5个奇数'而忽略 ch 其实是字符类型,或者误以为选项 B 的'5'就是数字5。还有很多人会纠结<和<=的区别,其实这题里A选项'ch < '5''只会匹配'1','2','3','4'四个,差一个就错了。若把范围看成'0'~'9',D选项依然成立,但B选项就会变成6次,这反向验证了字符ASCII值的奇偶交替特性才是命题人想考的。
这道题考查的是字符类型在算术运算中的行为,以及循环控制与条件判断的结合。命题人想挖的坑在于:考生往往只关注数字 1 到 9 的奇偶数量,而忽略了循环变量 ch 是 char 类型,其实际参与运算的是 ASCII 码值。
首先看循环本身:ch 从 '1' 递增到 '9',共执行 9 次。我们需要在横线处填入一个条件,使得 cnt 最终为 5。
逐项分析选项: A 选项 ch < '5':字符比较本质是 ASCII 比较。'1' 到 '4' 都小于 '5','5' 不小于 '5',所以 cnt 会累加 4 次。错误。 B 选项 ch >= 5:这里有个类型提升的细节。ch 是 char,5 是 int,char 会自动提升为 int。'5' 的 ASCII 码是 53,而整数 5 就是 5。显然 '1' 的 ASCII 码 49 已经大于 5 了,所以从 '1' 开始就满足条件,cnt 会累加 9 次。错误。 C 选项 ch >= '4':同理,'4' 的 ASCII 码是 52,从 '4' 到 '9' 共 6 个字符满足条件,cnt 为 6。错误。 D 选项 ch % 2 == 1:这是本题的精髓。char 参与取模运算时,先提升为 int,即取 ASCII 码。'1' 的 ASCII 是 49(奇数),'2' 是 50(偶数)……直到 '9' 是 57(奇数)。1 到 9 的 ASCII 码正好是 49 到 57,奇偶交替。其中奇数有 49, 51, 53, 55, 57 共 5 个。因此 cnt 恰好为 5。正确。
陷阱拆解:很多学生会误以为选项 B 中的'5'就是数字 5,从而认为它只匹配'5','6','7','8','9'这五个,这是典型的类型提升盲区。命题人特意用 ch >= 5 这种写法,就是为了测试你是否清楚 char 和 int 比较时的隐式转换规则。另外,若有人把循环范围误看成'0'~'9',D 选项依然成立(0~9 中奇数也是 5 个),但这会误导对 B 选项的判断,因为 B 在'0'~'9'下会变成 6 次,从而反向印证了字符 ASCII 值的奇偶交替特性才是本题的核心。
考频趋势:运算符与表达式在题库中已考过 261 题,覆盖 9 个级别。逐年分布显示 2023 年考了 91 题,2024 年 41 题,2025 年 61 题,2026 年 14 题,整体呈波动上升后回落趋势。分赛事看,GESP 二级考了 70 题,占比最高,说明二级对基础语法和类型提升的考查非常密集。在二级中,这类涉及字符算术、类型提升、取模运算的题目属于高频考点,尤其是 2023 年考了 91 题,2025 年又考了 61 题,显示命题人持续偏爱用字符运算来考察学生对底层数据类型的理解。
预测:基于 2023 年 91 题、2025 年 61 题的高频数据,以及二级在运算符与表达式类别中的高占比,未来 GESP 二级仍大概率会出类似的字符算术陷阱题,可能还会结合数组下标或字符串索引来增加复杂度。若数据不足以支撑更细粒度的预测,则暂无足够依据预测具体年份或变种,但方向上应重点关注 char 与 int 比较、取模运算中的类型提升规则,以及奇偶交替这类隐蔽的计数逻辑。