下面 C++ 代码执行后其输出是( )。
int count, i, j;
count = 0;
for (i = 1; i < 4; i++)
for (j = 0; j < i; j++) {
if (j % 3 == 0)
continue;
count += 1;
if (i * j >= 2)
break;
}
printf("%d %d %d", i, j, count);看到双重循环先锁定外层i的范围(1~3),内层j从0到i-1。关键要盯住continue跳过j%3==0的迭代,以及i*j>=2时立即break。循环结束后printf输出的是i,j的最终值,不是最后一次循环里的值,这点极易被忽略。
选项B把i写成3,选项D把j写成2,都是没注意到break后j停在1。选项A的count=2是对的,但i,j全错。最阴险的是printf在循环外,很多人会下意识用最后一次循环里的i,j去填,导致选错。
考纲定位:本题属于GESP二级"循环结构"模块,命题人专门卡住"循环结束后变量值"这个盲点。绝大多数考生会盯着最后一次循环里的i=3,j=1,却忘了printf在循环外,此时i已自增为4。
解题思维:外层i从1走到3,内层j从0走到i-1。j=0时j%3==0直接continue,count不加;j=1时count+1,i*j=2触发break,j停在1;i=2时j=0继续,j=1继续,i*j=2再break,j仍为1;i=3同理,j=1时break,j=1。循环结束i=4,j=1,count=2。
陷阱拆解:选项B的i=3是典型"循环内值"陷阱;选项D的j=2是误以为break后j++;选项A的count=2正确但i,j全错。最阴险的是printf在循环外,很多人会下意识用最后一次循环里的i,j去填,导致选错。
反命题思维:如果把break改成continue,内层会跑完所有j,count会多算;如果把printf移到循环内,输出会变成每次循环的值;如果把i<4改成i<=4,外层多一次i=4,count会再+1。