执行下面 C++ 代码后输出的第一个数是( )。
int main()
{
int a[20], i;
for (i = 0; i < 20; i++)
a[i] = i + 1;
for (; i > 0; i--)
cout << a[i - 1] << " ";
cout << endl;
return 0;
}答案A。数组和位运算的代码追踪要特别小心:数组下标从0开始,位运算结果可能不直观。建议画图辅助。
位运算追踪时建议把数字写成二进制形式再逐位计算。
【考点】循环控制流|数组索引边界|变量作用域延续
本题对应《GESP 大纲》“基础编程”模块“循环与数组”三级考点,同时考察数组下标与循环变量之间的依赖关系。命题人卡住的是绝大多数考生对"for 循环结束后 i 的值”的盲区——很多人默认 i=19,其实 i 会多跑一次变成 20。
第一遍循环 i 从 0 到 19 执行完,条件 i<20 失败时 i 已自增到 20。第二遍循环条件仍为 i>0,此时 i=20,故先访问 a[19]=20。通法:写循环必须追踪循环变量在循环结束后的状态,for 循环的 i 会在最后一次成功后再自增一次。
选项 B 是“循环结束 i=19"的惯性思维陷阱,忽略了 for 循环的自增发生在条件判断之后。选项 C 偷换概念,把第二次循环的起始 i 当成 1,实际上 i 仍为 20。选项 D 过于绝对地认为“不确定”,但 i 递减必然终止,只是初值易被忽略。最阴险的坑:只背“循环打印 a[0]~a[19]"而不懂变量延续,就会误选 B 或 C。
若把第二个循环改成 for(; i>=0; i--),首输出变 a[20](越界)或无输出——命题人会考察边界条件。若问“第一个输出”则答案固定为 20,这是典型的“首尾颠倒”陷阱。刷到类似题先问:命题人想卡住我对循环变量延续性的理解。