下面 C++ 程序执行的结果是( )。
int main()
{
int a[20], i;
int cnt = 0;
for (i = 0; i < 20; i++)
a[i] = i + 1;
for (; i > 1; i--)
if ((a[i - 1] + a[i - 2]) % 3)
cnt++;
cout << cnt << endl;
cout << endl;
return 0;
}这道题考的是循环变量作用域和数组下标计算。拿到题先别急着看代码细节,先盯住for循环结束后i的值——它停在1,而不是0,这是整个题目的关键突破口。
很多学生看到i--就下意识觉得循环会一直跑到0,或者误以为i被重置了,导致把循环次数算错;还有人会把a[i-1]+a[i-2]当成(i-1)+(i-2)直接代入,忽略了数组下标是从0开始的,其实a[i-1]对应的是i,a[i-2]对应的是i-1,加起来就是2i-1;最容易被坑的是选项B,把i=19这次迭代漏掉了,因为只算了18次循环,忘了i从19递减到2,共18次,但很多人会算成17次。
GESP三级《信息与计算》模块,重点考察循环控制和数组索引。命题人专门卡住"循环变量作用域"这个弱点——循环结束后i仍保留最终值,但学生容易误以为i被重置为0或1。
拿到这种题,别一上来就硬算,先抓住两个关键点: 1. 循环变量i的初始值:第一层循环for(i=0;i<20;i++)结束后,i停在19。 2. 第二层循环的边界:for(;i>1;i--),条件i>1意味着i从19递减到2才停止,共18次迭代。
很多人看到i--就默认i会归零,却忘了i保留的是退出时的值1,导致误判循环次数。这就是选项B的陷阱所在。