执行如下 C++ 代码,变量都是整型,则其输出是( )。
int cnt, i;
cnt = 0;
for (i = -10; i < 0; i++)
cnt += 1;
cout << (i * cnt);循环执行时,i 从 -10 开始,只要 i<0 就继续循环,每次循环 cnt 加 1。关键在于循环结束时的 i 值是多少——题目里 i 在循环体后自增,当 i=-1 时满足条件执行最后一次,随后 i 变成 0,条件 0<0 不再成立,循环终止。所以最后 i=0、cnt=10,输出 i*cnt=0。
错误选项 B 和 D 都源于对循环终止条件的误判。命题人挖了个坑:i 在循环体末尾才自增,考生容易以为循环结束时 i 仍停留在 -1,于是算出 i*cnt=-1*10=-10 或 -1*9=-9,却忘了自增已经把 i 推到了 0。正确选项 C 就是专门针对这个边界陷阱设置的。
本题考查循环控制与条件判断,属于 GESP 一级编程中的基础考点。命题人在这道选择题里埋了一个经典的「循环终止边界」陷阱:for 循环的自增操作发生在末尾,循环条件在自增后再次判断。绝大多数考生会忽略这个时序细节,误以为 i 停在 -1,从而选错。这道题的杀伤力就藏在「自增后条件不成立」这一秒的语义变化上。
看到这题先想循环执行了几次。i 初始为 -10,条件 i<0,所以 -10,-9,-8,…,-1 这 10 个数都会进入循环体,cnt 从 0 累加到 10。关键是循环结束时的 i 值——i 在循环体末尾执行 i++,因此当 i 从 -1 自增到 0 时,条件 0<0 不成立,循环终止。最终输出 i*cnt = 0*10 = 0。