下列 C++ 代码执行后将输出 1#4#9#16#16 。( )
cnt = 0;
for (i = 1; i < 5; i++) {
for (j = 1; j < i + 1; j++)
if (i * j % 10 == 0)
break;
if (j >= i + 1)
cout << (i * j) << "#";
}
if (i >= 5)
cout << (i * j);答案B。考点: 循环结构——for/while的执行与嵌套。
关键提醒:C++中的^是异或运算符,不是乘方!2^5=7而非32。这是最高频的错误。
【考点】循环控制与条件判断|整数运算与逻辑陷阱
🎯 考纲定位(考点定位) 本题考查 GESP 二级「循环与条件判断」模块。命题人专盯「嵌套 for 循环边界」与「循环后变量值」两大盲区——多数考生误以为内层循环会因取整条件提前退出,或忽视外层循环结束后 i 仍为 4 而非 5,导致对最终输出判断失准。
🧠 解题思维(拆解与通法) 先模拟循环:外层 i 从 1 到 4,内层 j 从 1 到 i(因 j < i+1)。内层 break 条件 i*j%10==0 在 i≤4 时永不成立,故 j 始终走到 i。此时 j≥i+1 不成立,不输出。外层结束后 i=4,不满足 i≥5,末尾再无任何输出。真正输出需 i≥5 且内层 j 能因取整条件提前中断,本题完全不满足。
🪤 陷阱拆解(命题人的套路) 错误选项 A 利用「循环后变量值」陷阱:考生常以为 for 循环结束后 i 自动变为 5,实则 i 停在 4。另一陷阱是「绝对化条件」:若内层 j 能因 i*j%10==0 提前 break,则 j 会小于 i+1,条件 j≥i+1 永远为假,导致内层不输出。本题把两个陷阱叠加,形成双重误导。
🔄 反命题思维(教练升华) 若将内层循环改为 j≤i+1,则当 i=5 时 j 可取 2,i*j=10 满足取整条件,程序将输出 10# 等;若将 break 条件改为 i*j%5==0,则 i=2 时 j=1 就触发 break,内层能输出 2#。刷到类似题,先问:循环边界是否真的覆盖到目标值?循环后变量是否按预期变化?这才是防坑关键。