GESP 一级 · GESP 202309 C++ 一级 第 12 题

选择题 · 答案 B · 考点:循环控制

← 整套速查表 GESP 一级 全部真题

题目

下面 C++ 代码执行后的输出是( )。

int n = 5;
int cnt = 1;
while (n >= 0) {
    cnt += 1;
    n -= 2;
}
cout << cnt;
答案:B

考点

循环控制

解题思维

这题就是让你当个‘人工调试器’。别想复杂公式,直接拿笔在草稿纸上画个表格,一行一行模拟 n 和 cnt 的变化,数到 n 第一次小于 0 时停手,最后看 cnt 是多少。

常见错误

最容易栽跟头的就是只数 n 减了几次,忘了 cnt 初始值已经是 1;或者把循环条件 n>=0 理解成 n>0,以为 n=0 那一步还会跑一次(虽然这题 n 是奇数永远碰不到 0,但这是命题人埋的通用坑);还有人会机械套用'向上取整'公式算出 3 次,却忽略了 cnt 初始加的那 1,直接选成 A。

详细解析(节选)

考点定位与命题意图

这道题考查的是 GESP 一级大纲中“循环结构”的核心能力——变量跟踪。命题人并没有出什么花哨的算法,而是把 while 循环的更新步骤(n-=2)和终止条件(n>=0)放在同一行里,专门用来卡住那些只记得“循环会一直执行”却不会动手追踪变量变化的考生。

绝大多数人看到 n>=0 就会下意识地想“这循环会跑好久”,但不会去数到底跑了多少步。这就是出题人想测试的:你面对一段代码,能不能像调试程序一样,一步步推演变量的值?这种“人工模拟”的能力是编程的基石,也是 GESP 一级最基础也最重要的考点之一。循环控制(5 题考频)虽然单独看很少,但在这里它和循环结构(77 题考频)结合,成了高频出现的“坑题”模式。

解题心法:像调试器一样思考

拿到题先想:n 初始是 5,每次循环 n-=2,所以 n 会依次变成 3, 1, -1, -3……关键观察:循环条件 n>=0 会在 n 变成 -1 时失效,所以循环体会执行到 n=1 的那一次为止。

一句话说清:这类题就是数“从起始值到刚好小于 0 需要减多少次”。对于 n-=2 的情况,次数 = ceil(起始值/2),再加上初始的 cnt=1,最终答案就是 ceil(起始值/2)+1。

逐行模拟推演(核心步骤)

为了保险起见,我们老老实实画个表,一行一行跑,这是最稳妥的“防坑”手段:

步骤循环前 n执行 cnt+=1执行 n-=2循环条件 n>=0是否继续
初始5----
第 1 次5cnt=2n=33>=0是
第 2 次3cnt=3n=11>=0是
第 3 次1cnt=4n=-1-1>=0否

注意看表格最后一行:当 n 变成 -1 时,条件 n>=0 显然不成立,循环立即终止。所以 cnt 最终定格在 4。

陷阱拆解与避坑指南

A(3) 是只数 n 从 5 到 -1 经过了几次减 2,但忘了 cnt 初始已经是 1;C(6) 把 cnt 当成 n 的某个函数;D(7) 误以为条件 n>=0 会让 n=0 也执行一次。

最阴险的细节:条件 n>=0 是“≥”不是“>”,但本题 n 是奇数永远不会等于 0,所以这个细节在这里没有发挥作用,却容易让人误以为会多执行一次。如果你只背结论“循环会执行到变量小于 0”而不理解每一步的变化,就会掉进“只数 n 的变化次数”的陷阱,选错 A 或 C。

反命题思维与趋势预测

如果把 n-=2 改成 n-=3,那么 n 会从 5 到 2 到 -1,循环次数变成 2,答案就会变成 3。刷到类似题时,先问自己:“循环条件到底是 ≥ 还是 >?变量每次减多少?初始值是多少?”这样就能一眼看出答案,而不是盲目数次数。

从考频数据看,循环结构在 2023-2026 年连续四年都是重头戏(77+128+158+161 题),尤其是 GESP 一级(139 题)和二级(172 题)占比最高,说明“简单模拟”依然是命题人的最爱。循环控制虽然总数只有 5 题,但集中在 CSP 提高级和 GESP 二级,属于“小而精”的考点。未来大概率会继续在 GESP 一级、二级中高频出现,形式上可能换成 n+=k 或 n-=k 的变体,但核心逻辑不变:让你当个“人工调试器”。

综上,本题答案选 B. 4。

同考点真题

在 OI伴学 里做这道题
登录后可计时作答、查看完整六段式解析,并按你的错题自动生成同类练习。
去刷题先做一次 AI 学情诊断