【问题标题】:Can you explain why this code has this output?你能解释一下为什么这段代码有这个输出吗?
【发布时间】:2020-12-09 14:41:59
【问题描述】:
#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]);
    }
}

你能解释一下为什么这段代码会输出这个:

6 5 4 3 4 5 6 

谢谢。

【问题讨论】:

  • 你期望什么输出,为什么?
  • 因为这是 C 标准所说的。你期望什么输出?你为什么感到惊讶?

标签: arrays c dynamic-programming


【解决方案1】:

这个

a[6-i]=i;

会像这样分配数组

a[6]=0
a[5]=1
a[4]=2
a[3]=3

等等。不过

a[i]=i;

会像这样分配它

a[0]=0
a[1]=1
And this goes on.

由于a[6] 已分配为0,它在第7 次循环替换a[6]=6 等等。我不知道你期待什么。

【讨论】:

  • 没有。它不记住值,只是覆盖它们。虽然a[6] = 0 一开始是正确的,但a[6] = 6 稍后会覆盖(我一定听起来像个疯子,但一秒钟前有评论)
  • 但是怎么做呢? [a[6]=0] 中的记忆值不是吗?如果数组中最后记忆的值从 [a[6-i]=i] 和如果条件要求严格 [i 怎么会有第 7 个循环
  • 有第七个循环,因为 i 从 0 开始。这意味着它转到 c 0 &lt; 7, 1 &lt; 7, 2 &lt; 7, ..., 5 &lt; 7, 6 &lt; 7, 其他所有内容请参阅我的其他帖子
  • 非常感谢您对我的包容。但我真的无法理解它是如何在这里覆盖 a[6-i]=i 并且输出的另一半仍然打印,3 4 5 6
  • @jeram 一旦 i > 3,a[i] 在后半部分写入,a[6-i] 在前半部分写入。所以一切都被覆盖了,否则你会有 1234321
【解决方案2】:

当您不明白为什么您的程序会以某种方式运行时,最好的方法是对其进行调试。为此,您应该使用像 gdb 这样的调试器,这是一个很棒的工具,您真的应该学习使用它,特别是因为您是初学者。 这是tutorial for beginners。您还应该阅读this

现在你的问题,因为你的代码很小,我们可以通过展开它来手动调试它,U表示未定义的值:

  • i == 0,你有a = {0, U, U, U, U, U, 0}
  • i == 1,你有a = {0, 1, U, U, U, 1, 0}
  • i == 2,你有a = {0, 1, 2, U, 2, 1, 0}
  • i == 3,你有a = {0, 1, 2, 3, 2, 1, 0}

现在你的程序应该停止了,因为它开始覆盖旧值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    • 2021-09-15
    • 2020-04-14
    • 2021-04-22
    • 1970-01-01
    相关资源
    最近更新 更多