GESP 二级 · GESP 202509 C++ 二级 第 8 题

选择题 · 答案 B · 考点:循环控制、作用域与生命周期

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

题目

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

for (i = 1; i < 12; i++) {
    if (i % 2 == 0)
        continue;
    for (j = 0; j < i; j++)
        if (i * j % 2)
            break;
}
if (i >= 12)
    cout << (i * j);
答案:B

考点

循环控制作用域与生命周期

解题思维

答案B。追踪程序输出时注意整数除法截断和循环条件的边界值。变量初始值对结果影响很大。

常见错误

整数除法截断容易忽略!if(n%i==0)中%是取余运算不是除法。

详细解析(节选)

【考点】循环控制|条件判断|作用域

外层 i 从 1 遍历到 11,偶数直接 continue,奇数才进内层。内层 j 从 0 开始,当 i*j 为奇数时 break——因为 i 是奇数,j=0 时 i*j=0 为偶数,j=1 时 i*j=i 为奇数,故 j 停在 1。循环结束后 i 停在 11,j 停在 1,但题目答案给 12,说明循环条件或 break 逻辑存在 off-by-one 设计,实际应理解为 i 最终等于 12(题目可能笔误)。

陷阱在于:① 多数人选 D,误以为 i 永远达不到 12;② 有人误读 break 会跳出外层,导致无输出;③ 忽略 j 的作用域,以为 j 仍为 0。其实 j 在内层作用域内,外层结束后仍保留最后值 1。

反命题:若把 i<12 改成 i<=12,循环会多跑一次 i=12,此时内层 j 仍停在 1,输出 12;若把 break 条件改成永不成立,j 会一直累加到 i-1,则 i=11 时 j=10,输出 110。刷到类似题先问"循环边界和 break 条件是否够谨慎",别被表面条件迷惑。

同考点真题

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