下面的 C++ 不能实现如下输出,但如果将 L1 标记的 cout << 0 行移动 if 块外面,或者说移动到 L2 标记行,则可以。( )
请输入矩阵大小n: 9
100000000
020000000
003000000
000400000
000050000
000006000
000000700
000000080
000000009int 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。追踪程序输出时注意整数除法截断和循环条件的边界值。变量初始值对结果影响很大。
整数除法截断容易忽略!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 的语义差异是命题人最爱考的细节,审题时务必区分"跳过本次"和"跳出循环"。