下面 C++ 代码执行后其输出是( )。
int i, j;
for (i = 1; i < 12; i++) {
if (i % 2 == 0)
continue;
for (j = 0; j < i; j++)
if (i * j % 2 == 0)
break;
if (j >= i)
cout << i * j << " ";
}
if (i >= 12)
cout << (i * j);答案C。追踪程序输出时注意整数除法截断和循环条件的边界值。变量初始值对结果影响很大。
整数除法截断容易忽略!if(n%i==0)中%是取余运算不是除法。
【考点】循环控制|条件判断|变量作用域
1. 🎯 考纲定位:本题考查 GESP 二级大纲第 3 章"循环结构"中的 continue/break 语句,以及第 1 章"变量作用域"的隐式作用域规则。命题人专门卡住考生对"continue 只跳过本次循环剩余语句,外层继续执行"和"内层循环变量 j 的作用域自然延伸到外层 if(i>=12) 判断"这两个易错点的理解。
2. 🧠 解题思维:外层 i 从 1 遍历到 11,偶数 i 因 continue 被跳过,只处理 i=1,3,5,7,9,11。内层 j 从 0 开始,只要 i*j 为偶数就 break;由于 i 为奇数,i*j 在 j=0 时即为 0(偶数),因此内层循环永远在 j=0 处 break,j 始终等于 0。j>=i 条件因 0>=i 恒假而从不打印,循环结束后 i=12 触发 if(i>=12),此时 j 仍为 0,输出 i*j=0。
3. 🪤 陷阱拆解:若误以为 continue 会终止整个循环,会得出 i 只取 1 的错误结论;若忽略 j 的作用域,会认为 i>=12 时 j 未定义;若误判奇数乘积的奇偶性,会得出 j 递增到 i-1 的错误流程。最阴险的细节是"j 在循环外仍有效"——考生常把 j 当成纯局部变量,导致最终输出判断完全错误。
4. 🔄 反命题思维:命题人若把 continue 改成 break,或把内层 break 条件改为 i*j%2!=0,输出将变为 0 11 或 11,这正是考察"条件改变如何影响流程"的变式题。刷到类似循环题时,先问自己:"题目改了 continue/break 的条件,变量作用域和输出会怎样?"