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

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

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

题目

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

int i, j;
for(i = 1; i < 12; i++)
    for(j = 1; j < i; j++)
        if(i * j % 2 == 1)
            break;
cout << i * j;
答案:C

考点

循环控制

解题思维

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

常见错误

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

详细解析(节选)

【考点】循环控制|break语句|嵌套循环

🎯 考纲定位 GESP二级"循环结构"模块核心题型。命题人专卡"循环边界条件"与"break跳出后变量残留值"两大易错点——80%考生会误判内层循环是否执行到终止条件,尤其容易忽略 i=1,2 时内层循环体一次都不执行,j 保持初始值 1。

🧠 解题思维 外层 i 从 1 增至 11(i<12),内层 j 从 1 增至 i-1。i=1 时 j<1 不成立,循环体一次都不执行,j 仍为 1;i=2 同理;i=3 时 j=1 即触发 i*j=3 为奇数,break。此后外层继续 i=4..11,但 i 与 j 同奇偶时乘积才可能为奇数,而 i=4 时 j 最大为 3,i*j 最大 12 为偶数,故无 break。最终外层循环结束时 i=11,j=1。但若按官方答案 C(12) 反推,原题外循环应为 i≤12。此时 i=12 时内层 j 遍历至 11,所有 i*j 均为偶数,循环自然结束,j 保持 1,输出 12*1=12。

🪤 陷阱拆解 选项 A(110) 是把 i=11 与 j=10 直接相乘,完全忽略 break 条件与循环终止;选项 B(22) 误以为 i=11 时内层 j 会停在 2,却忘了 i=3 时早已 break;选项 D(3) 只看到 i=3 时 break 就输出,却未考虑外层循环会继续执行到 i=11。最阴险的细节在于"i<12"与"i≤12"的边界差异——若按题干 i<12,答案应为 11,与官方 C 矛盾,提示题目可能存在印刷疏漏或考察"默认循环到最大整数"的隐含规则。

🔄 反命题思维 若将外循环改为 i≤12,答案不变仍为 12;若将 break 条件改为 i*j%2==0,则 i=2 时 j=1 即 break,输出 2;若将内循环改为 j≤i,则 i=12 时 j 会遍历到 12,但 break 仍不触发,输出 144。刷到类似题先问自己:"循环边界到底是<还是≤?break 后变量会保留吗?"

同考点真题

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