请解释以下C语言代码为何输出6 5 4 3 4 5 6
为什么这段C语言代码的输出是6 5 4 3 4 5 6?
首先先把这段代码完整贴出来,方便我们一步步拆解分析:
#include <stdio.h> int main(){ int a[7]; for (int i=0; i<7; i++) { a[i]=i; a[6-i]=i; } for (int i=0; i<7; i++) { printf("%d ", a[i]); } }
核心问题出在第一个for循环的赋值逻辑上——后面的赋值操作会覆盖前面的结果,而且当i和6-i指向同一个数组索引时,赋值相当于做了一次重复操作。我们逐个遍历i的取值(从0到6),跟踪数组的实时变化:
当
i=0时:- 先执行
a[0] = 0,数组变为[0, ?, ?, ?, ?, ?, ?] - 再执行
a[6-0] = 0也就是a[6] = 0,数组现在是[0, ?, ?, ?, ?, ?, 0]
- 先执行
当
i=1时:- 先执行
a[1] = 1,数组变为[0, 1, ?, ?, ?, ?, 0] - 再执行
a[6-1] = 1也就是a[5] = 1,数组现在是[0, 1, ?, ?, ?, 1, 0]
- 先执行
当
i=2时:- 先执行
a[2] = 2,数组变为[0, 1, 2, ?, ?, 1, 0] - 再执行
a[6-2] = 2也就是a[4] = 2,数组现在是[0, 1, 2, ?, 2, 1, 0]
- 先执行
当
i=3时:- 先执行
a[3] = 3,数组变为[0, 1, 2, 3, 2, 1, 0] - 再执行
a[6-3] = 3也就是a[3] = 3——和前面的赋值完全一样,数组没有变化
- 先执行
当
i=4时:- 先执行
a[4] = 4,把之前i=2时赋值的2覆盖掉,数组变为[0, 1, 2, 3, 4, 1, 0] - 再执行
a[6-4] = 4也就是a[2] = 4,把之前i=2时赋值的2覆盖掉,数组现在是[0, 1, 4, 3, 4, 1, 0]
- 先执行
当
i=5时:- 先执行
a[5] = 5,把之前i=1时赋值的1覆盖掉,数组变为[0, 1, 4, 3, 4, 5, 0] - 再执行
a[6-5] = 5也就是a[1] = 5,把之前i=1时赋值的1覆盖掉,数组现在是[0, 5, 4, 3, 4, 5, 0]
- 先执行
当
i=6时:- 先执行
a[6] = 6,把之前i=0时赋值的0覆盖掉,数组变为[0, 5, 4, 3, 4, 5, 6] - 再执行
a[6-6] = 6也就是a[0] = 6,把之前i=0时赋值的0覆盖掉,数组最终变成[6, 5, 4, 3, 4, 5, 6]
- 先执行
第二个for循环只是逐个打印数组里的元素,所以最终输出就是 6 5 4 3 4 5 6。
内容的提问来源于stack exchange,提问作者Jeram
相关产品推荐
相关产品推荐

