You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

请解释以下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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 07:38:03