下面 C++ 代码执行后的输出是 ( )。
cnt = 0;
for(i = 1; i < 10; i++)
for(j = 1; j < i; j += 2)
if (i * j % 2 == 0) {
cnt++;
break;
}
if(i >= 10) cout << cnt << "#";
cout << cnt;这题核心是追踪嵌套循环里cnt的累加次数,以及循环结束后i的值是否满足if条件。关键在于内层j每次+2只取奇数,所以i×j为偶数等价于i为偶数,cnt只会在i=2,4,6,8时各加1次,共4次。外层循环结束后i仍为9,不满足i>=10,故第一行cout不执行,最终只输出4。
很多学生会误以为内层循环会遍历到偶数j,从而算出cnt=8,或者混淆循环条件i<10与判断条件i>=10,以为循环结束后i会变成10,导致误选B(8#8)。还有人会忽略break的作用,以为if条件不满足时内层循环会继续跑完所有j,从而得出cnt=0。最隐蔽的坑在于if语句后紧跟的两个cout:第一个在i>=10时才输出cnt#,第二个无条件输出cnt。学生常只关注循环过程,忘记循环结束后i的值仍是9,因此第一个cout不会执行,只输出第二个cnt。
本题属于GESP二级算法基础中嵌套循环与变量作用域的综合考查。命题人特意设计了内层循环j每次+2,使得j始终为奇数,从而将判断i×j%2==0转化为判断i是否为偶数,考查学生对奇偶性乘法性质的理解。同时,在循环结束后用if(i>=10)控制是否输出带#的cnt,再无条件输出cnt,双重陷阱要求学生不仅会算循环次数,还要准确追踪循环结束后变量的状态。解题时先模拟外层循环i从1到9的每一步:当i=1时,内层j从1开始j<1不成立,cnt不变;i=2时,j=1满足j<2且i×j=2为偶数,cnt加1后break;i=3时,j=1,i×j=3为奇数,不满足if,j跳至3,j<3不成立,内层结束;i=4时,j=1满足条件,cnt加1后break;i=5时,j=1,3均不满足i×j为偶数,内层跑完;i=6时,j=1满足,cnt加1后break;i=7时,j=1,3,5均不满足;i=8时,j=1满足,cnt加1后break;i=9时,j=1,3,5,7均不满足。至此cnt=4,外层循环结束,i的值停留在9。接下来判断if(i>=10),9>=10为假,不执行cout<<cnt<<"#";最后执行cout<<cnt,输出4。因此正确答案是D。
易错点方面,学生常忽略j+=2导致j只取奇数,误算cnt=8;或误以为循环结束后i自增为10,从而触发第一行cout,得到8#8;还有人没注意break,以为if不满足时内层循环会继续,导致cnt=0。最隐蔽的坑在于两个cout的顺序和条件:第一行只在i>=10时输出,第二行无条件输出,学生容易只关注循环过程而忘记循环结束后i的值仍是9,从而漏掉第一行输出。命题人通过这种设计,既考查循环控制,又考查变量作用域和条件判断的优先级。
从考频趋势看,循环结构在题库中占比很高,2023年77题、2024年128题、2025年158题、2026年161题,呈逐年上升趋势,说明循环嵌套与边界判断是近年高频考点。控制结构整体2023年81题、2024年138题、2025年160题,同样持续增长。循环控制(含break、continue、变量作用域)虽只有5题,但2023年2题、2024年1题,且集中在GESP二级和CSP提高级,显示这类细节题在二级考试中越来越受命题人青睐。基于此,未来GESP二级及六级、七级考试中,嵌套循环后紧跟条件判断或输出语句的题目仍可能出现,且更可能加入变量作用域陷阱或循环终止条件混淆。
总结:拿到这类题,先模拟循环,注意内层步长对j的影响,再追踪cnt累加次数,最后务必检查循环结束后变量的值是否满足后续if条件,以及cout的执行顺序。只有把循环过程、变量状态、条件判断三步都做对,才能避开所有坑,选对答案D。