有人知道我的C程序的这种奇怪的输出是如何发生的吗?

有人知道我的C程序的这种奇怪的输出是如何发生的吗?,c,arrays,queue,output,C,Arrays,Queue,Output,我不明白为什么下面的C代码会导致下面的输出 我想编写一个数组队列,我所做的一切准备就是编写函数“enqueue_fct”,它向队列添加新元素并“循环”数组 代码: 从第五行开始,输出是我所期望的,但是前四行呢?我不是说,为什么它不以“array[0]”开头,很清楚为什么会这样。但是在正确的输出从数组的第二个“循环”开始之前,我不知道“0,-13210,0,0”来自哪里 我是一个初学者,所以如果代码中有一个非常愚蠢的错误,请宽容我,并尝试用初学者能够理解的简单词语解释;-) 非常感谢你的帮助 附言

我不明白为什么下面的C代码会导致下面的输出

我想编写一个数组队列,我所做的一切准备就是编写函数“enqueue_fct”,它向队列添加新元素并“循环”数组

代码:

从第五行开始,输出是我所期望的,但是前四行呢?我不是说,为什么它不以“array[0]”开头,很清楚为什么会这样。但是在正确的输出从数组的第二个“循环”开始之前,我不知道“0,-13210,0,0”来自哪里

我是一个初学者,所以如果代码中有一个非常愚蠢的错误,请宽容我,并尝试用初学者能够理解的简单词语解释;-)

非常感谢你的帮助

附言: 我正在使用EclipseNeon.2发行版(4.6.2)和最新的cygwin gcc编译器,它位于Windows1064位

编辑:

由于2501的回答,我更正了代码,并在printf语句中添加了一个-1

printf ("array[%d] --> %d\n", last, array [last-1]);
现在输出中还有一个问题,我不明白:

array[1] --> 0
array[2] --> 1
array[3] --> 2
array[4] --> 3
array[0] --> 1
array[1] --> 5
array[2] --> 6
array[3] --> 7
array[4] --> 8
array[0] --> 1
array[1] --> 10
array[2] --> 11
array[3] --> 12
array[4] --> 13
array[0] --> 1
array[1] --> 15
array[2] --> 16
array[3] --> 17
array[4] --> 18
array[0] --> 1
为什么数组[0]总是“1”而不是“4”、“9”、“14”、“19”?对不起,就像我说的,我是初学者

EDIT2:

我自己就知道了:当循环开始时“last”变成“0”时,“array[last-1]”就是“array[-1]”,它不是数组的一部分,所以“1”是垃圾数据


每个人一开始都是完整的编程noob;-)

打印的不是刚刚分配给数组的元素,而是下一个元素。调用printf时,变量last为下一个元素编制索引


在第一个MAX循环中打印数组的未初始化元素,在后续循环中打印在前一个MAX循环中分配的值。

您打印的不是刚刚分配给数组的元素,而是下一个元素。调用printf时,变量last为下一个元素编制索引


在第一个MAX循环中打印数组的未初始化元素,在后续循环中打印在前一个MAX循环中分配的值。

这是因为在打印结果之前更新了
last
的值

last = enqueue_fct (newElem++, array, last);
printf ("array[%d] --> %d\n", last, array [last]);
fflush (stdout);
enqueue_fct
返回数组中下一个元素的索引值(在数组末尾滚动)。您正在使用此值打印刚刚分配的元素,但是在
enqueue\u fct
返回后,它将指向下一个元素


例如,在第一次使用
last=0
调用
enqueue\u fct
后,它分配
last=1
。然后打印
array[last]
,它是数组的第二个元素,而不是第一个元素。由于数组未初始化,您将得到垃圾。

这是因为在打印结果之前更新了
last
的值

last = enqueue_fct (newElem++, array, last);
printf ("array[%d] --> %d\n", last, array [last]);
fflush (stdout);
enqueue_fct
返回数组中下一个元素的索引值(在数组末尾滚动)。您正在使用此值打印刚刚分配的元素,但是在
enqueue\u fct
返回后,它将指向下一个元素

例如,在第一次使用
last=0
调用
enqueue\u fct
后,它分配
last=1
。然后打印
array[last]
,它是数组的第二个元素,而不是第一个元素。由于数组未初始化,您将得到垃圾。

也许您的意思是:

int main (void)
{
    int newElem = 0;
    int array [MAX];
    int last = 0;
    int i, newlast;

    for (i = 0; i < 20; i++)
    {
        newlast = enqueue_fct (newElem++, array, last);
        printf ("array[%d] --> %d\n", last, array [last]);
        last = newlast;
    }

    return (EXIT_SUCCESS);
}
int main(无效)
{
int-newElem=0;
整数数组[MAX];
int last=0;
int i,newlast;
对于(i=0;i<20;i++)
{
newlast=enqueue_fct(newElem++,数组,last);
printf(“数组[%d]-->%d\n”,last,数组[last]);
last=newlast;
}
返回(退出成功);
}
也许你的意思是:

int main (void)
{
    int newElem = 0;
    int array [MAX];
    int last = 0;
    int i, newlast;

    for (i = 0; i < 20; i++)
    {
        newlast = enqueue_fct (newElem++, array, last);
        printf ("array[%d] --> %d\n", last, array [last]);
        last = newlast;
    }

    return (EXIT_SUCCESS);
}
int main(无效)
{
int-newElem=0;
整数数组[MAX];
int last=0;
int i,newlast;
对于(i=0;i<20;i++)
{
newlast=enqueue_fct(newElem++,数组,last);
printf(“数组[%d]-->%d\n”,last,数组[last]);
last=newlast;
}
返回(退出成功);
}

。。您不需要
fflush(stdout)
printf
是行缓冲的,因此当它看到
\n
字符(您拥有的)时,它会将其缓冲区刷新到
stdout
。谢谢您,yano。当我在不需要的地方添加fflush(stdout)时,它会降低性能吗?嗯,好问题。您必须检查生成的程序集,但我怀疑是的,添加
fflush(stdout)此处将添加额外(不必要)指令,从而降低性能。我不认为编译器会对此进行优化(即使它查看
printf
字符串并在最后看到
'\n'
,也必须确保那时没有其他东西写入
stdout
)。但我只是想大声说出来,比我聪明的人需要回答。。您不需要
fflush(stdout)
printf
是行缓冲的,因此当它看到
\n
字符(您拥有的)时,它会将其缓冲区刷新到
stdout
。谢谢您,yano。当我在不需要的地方添加fflush(stdout)时,它会降低性能吗?嗯,好问题。您必须检查生成的程序集,但我怀疑是的,添加
fflush(stdout)此处将添加额外(不必要)指令,从而降低性能。我不认为编译器会对此进行优化(即使它查看
printf
字符串并在最后看到
'\n'
,也必须确保那时没有其他东西写入
stdout
)。但我只是想大声说出来,比我聪明的人需要回答。k、 ,那是个愚蠢的错误。。。非常感谢。我不能给你一票,因为我的名声不好。k、 ,那是一个愚蠢的错误