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

判断题 · 答案 A · 考点:循环控制

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

题目

下面的 C++ 不能实现如下输出,但如果将 L1 标记的 cout << 0 行移动 if 块外面,或者说移动到 L2 标记行,则可以。( )

请输入矩阵大小n: 9
100000000
020000000
003000000
000400000
000050000
000006000
000000700
000000080
000000009
int n, i, j;
cout << "请输入矩阵大小n: ";
cin >> n;

for (i = 0; i < n; i++){
    for (j = 0; j < n; j++){
        if (i == j){
            cout << i + 1;
            continue;
            cout << 0; // L1
        }
        // L2
    }
    printf("\n");
}
答案:A

考点

循环控制

解题思维

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

常见错误

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

详细解析(节选)

【考点】continue 语句|循环控制流|if 块作用域

🎯 考纲定位 本题精准卡住对 continue 作用域的理解盲区——它跳出的是当前循环体,而非仅 if 块。命题人专攻初学者"continue 只管 if 内部"的致命误区,这是 GESP 二级循环逻辑的高频失分点。

🧠 解题思维 看到 if (i == j) 内的 continue,第一反应是"它会跳过后面所有语句"。但关键陷阱在于:continue 的跳出范围是整个 for 循环体,而非仅 if 块。所以 L1 处的 cout << 0; 在 i==j 时根本不会执行;而 i!=j 时,if 条件不成立,continue 被跳过,程序会执行 L1 的 cout << 0;。移动 L1 到 L2 后,i==j 时 continue 仍会跳过 L2 的 cout << 0;,i!=j 时则正常执行。

🪤 陷阱拆解 选项 B 的错误源于"语句块归属误判"——考生常误以为 continue 只影响 if 内部。其实只要 continue 出现在 if 内,它就能跳出外层循环。移动 L1 到 L2 后,对角线 i+1 正确打印,其余位置 0 也正确输出,完美匹配题目要求的矩阵格式。

🔄 反命题思维 若把 L1 改到 if 之前,则对角线会多印一个 0;若用 break 替代 continue,则内层循环会提前终止,导致后续行只打印对角线。这提醒我们:continue 与 break 的语义差异是命题人最爱考的细节,审题时务必区分"跳过本次"和"跳出循环"。

同考点真题

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