下面 C++ 代码执行后的输出是( )。
int cnt = 0;
for (int i = 1; i < 13; i += 3)
for (int j = 1; j < i; j += 2)
if (i * j % 2 == 0)
break;
else
cnt += 1;
cout << cnt;这题考嵌套循环和break。外层i=1,4,7,10;内层j< i且步长2。i=1时内层不跑;i=4时j=1就偶数break;i=7时j=1,3,5全是奇数cnt累加3;i=10时j=1偶数break。答案B。
容易把i=1当成cnt=1,其实j<1内层一次都不进。还有把break理解成只跳一次迭代,其实只要遇到偶数就立刻跳出内层。另外i=7时j取1,3,5三个值,有人会漏算j=5的情况,导致cnt算少。
本题属于GESP二级“程序基础”中循环嵌套与break语句的协同考察。命题人特意把break放在内层循环的条件判断里,目的就是卡住考生对“break只跳出当前层”这一基本规则的模糊认知——很多人误以为break会结束整个程序或外层循环,这题就是专门来纠正这个致命误区的。同时,外层循环步长3与内层步长2的组合,加上i=1这个边界情况,也是常见的挖坑点。从历年数据看,控制结构在题库共考过429题,覆盖7个级别,其中2025年考了160题,2024年138题,说明这类逻辑判断题是高频考点;而循环结构共609题,2025年更是高达158题,GESP二级单独就有172题,可见嵌套循环是二级必考重镇。
拿到这种嵌套循环题,第一反应不是急着写代码,而是先模拟执行流程。外层循环i从1开始,步长3,条件i<13,所以i依次取1,4,7,10。内层循环j从1开始,步长2,条件是j<i。关键在于内层那行if (i * j % 2 == 0) break; else cnt += 1;。这里有个细节:i*j是奇数还是偶数,取决于i和j的奇偶性。因为i和j都是整数,且j从1开始步长2,所以j永远是奇数。那么i*j的奇偶性就完全由i决定:i是奇数时,i*j是奇数;i是偶数时,i*j是偶数。