以下代码执行后,数组 arr 的内容是( )
int arr[6] = {1, 2, 3, 4, 5, 6};
for (int i = 0; i < 6; i += 2) {
arr[i] = arr[i] + arr[i+1];
arr[i+1] = arr[i] - arr[i+1];
arr[i] = arr[i] - arr[i+1];
}答案A。追踪for循环:记录每次循环变量的值和累积结果的变化。注意循环终止条件。
for循环体可能一次都不执行!这是和while循环一样的"先判断后执行"机制。
【考点】数组元素访问|循环控制|变量状态追踪
本题是GESP三级"数据与算法"模块中数组操作的基础题。命题人卡在90%考生对数组就地修改的直觉上,以为i+=2后arr[i]不变,却忘了循环体内部已污染了arr[i+1]——这正是三级考生最容易忽略的"状态污染"陷阱。
看到i+=2立即锁定"成对处理",三行赋值是经典"不借助临时变量交换"的算术技巧:a=a+b、b=a-b、a=a-b。循环每轮把arr[i]和arr[i+1]的值互换,最终结果就是整个数组两两交换。这一类题的通法是:识别循环步长决定处理粒度,识别三行算术交换,追踪每轮状态变化。
错误选项C是典型"只执行前两步"的错觉陷阱,误以为arr[i]先被替换成和再被减回;选项D则把i+=2理解成跳过i+1,却忘了循环体内arr[i+1]在下一轮已变成新值;选项B更是直接忽略循环,把数组当原样考。这里最阴险的是"状态追踪"——如果你只背"三行交换"结论,不代入具体数值,就会掉进选项D的陷阱。
若把i+=2改成i++,数组会完全反转;若把三行换成临时变量交换,结果相同。刷到这种"三行算术交换"题,先问自己"这题是不是在考我状态追踪?"