C For数组的循环-从上一个值添加

C For数组的循环-从上一个值添加,c,arrays,loops,for-loop,numbers,C,Arrays,Loops,For Loop,Numbers,我有来自Koshar的c编程的以下代码。我确实了解它是如何工作的,我只是不知道for循环中哪里会获取前面的值。预期结果我将其粘贴在代码下,以便于组织 #include <stdio.h> int main(void) { int number [10] = {1, 0, 0, 0, 0, 0, 0, 0, 0, 0}; int i, j; for( j = 0; j < 10; ++j) for (i = 0; i < j; ++i)

我有来自Koshar的c编程的以下代码。我确实了解它是如何工作的,我只是不知道for循环中哪里会获取前面的值。预期结果我将其粘贴在代码下,以便于组织

#include <stdio.h>

int main(void) {
int number [10] = {1, 0, 0, 0, 0, 0, 0, 0, 0, 0};
    int i, j;

    for( j = 0; j < 10; ++j)
        for (i = 0; i < j; ++i)
            number[j] += number[i];

    for (j = 0; j < 10; ++j)
        printf ("%i ", number [j]);

        printf("\n");

        return 0;
}
#包括
内部主(空){
整数[10]={1,0,0,0,0,0,0,0,0,0,0};
int i,j;
对于(j=0;j<10;++j)
对于(i=0;i
输出

1 1 2 4 8 16 32 64 128 256


为了了解发生了什么,您应该在每次迭代外部
for
循环(即
j
上的循环)后,打印数组
编号
的状态。以下是阵列的外观:

Before:       1 0 0 0 0 0 0 0 0 0 
After 1 run:  1 1 0 0 0 0 0 0 0 0 
After 2 runs: 1 1 2 0 0 0 0 0 0 0 
After 3 runs: 1 1 2 4 0 0 0 0 0 0 
After 4 runs: 1 1 2 4 8 0 0 0 0 0 
After 5 runs: 1 1 2 4 8 16 0 0 0 0 
After 6 runs: 1 1 2 4 8 16 32 0 0 0 
After 7 runs: 1 1 2 4 8 16 32 64 0 0 
After 8 runs: 1 1 2 4 8 16 32 64 128 0 
After 9 runs: 1 1 2 4 8 16 32 64 128 256
的内部
循环(在
i
上)将迄今为止收集到的所有以前的数字添加到
j
位置的数字中,因此
数字[1]
的项和为0..0,
数字[2]
的项和为0..1,
数字[3]
的项和为0..2,依此类推。您可以看到每次迭代如何用适当的数字和替换下一个零。

对于(j=0;j<10;++j),这是您的外循环 对于(i=0;i 步骤1.外循环运行一次,内循环运行j次。(因为j=0所以不要运行)。数字[0]=1
步骤2.外循环运行一次,内循环运行j次。(因为j=1所以不要运行)。数字[1]=1
步骤3.外循环运行一次,内循环运行j次。(因为j=2所以不要运行)。数字[2]=2
步骤4.外循环运行一次,内循环运行j次。(因为j=3所以不要运行)。数字[3]=4
步骤5.外循环运行一次,内循环运行j次。(因为j=4所以不要运行)。数字[4]=8
步骤6.外循环运行一次,内循环运行j次。(因为j=5所以不要运行)。数字[5]=16
步骤7.外循环运行一次,内循环运行j次。(因为j=6所以不要运行)。数字[6]=32
步骤8.外循环运行一次,内循环运行j次。(因为j=7所以不要运行)。数字[7]=64
步骤8.外循环运行一次,内循环运行j次。(因为j=8所以不要运行)。数字[8]=128
步骤10.外循环运行一次,内循环运行j次。(因为j=9所以不要运行)。数字[9]=256

我确实了解它是如何工作的,我只是不知道for循环中哪里会获取前面的值

这段代码:

    for (i = 0; i < j; ++i)
        number[j] += number[i];

你能把你的答案格式化,让它更容易看吗?您还错误地输入了步骤9(现在是8)。如果您想被录取,请对您的答案进行正确的格式设置。这一行:number[j]+=number[i];实际上是写这行的快捷方式:number[j]=number[j]+number[i];这就是当前代码从以前的代码更新的地方。顺便说一句:在每个代码块,甚至单行代码块周围使用“{”和“}”,大大提高了可读性,并使代码的后期维护人员在编辑代码时出错的可能性大大降低。谢谢!还有一个问题,我如何“打印州”?我不知道我能像你一样打印。谢谢您的帮助。@MyNameIsHaruo我从您的代码中获取了打印逻辑,并将其添加到外部循环中。我需要将循环变量从
j
重命名为
k
,并在外部循环中的代码周围加上大括号,因为现在我们有多个语句在里面。谢谢!这让我更好地理解了@dasblinkenlight对@MyNameIsHaruo的评论,很高兴我能帮上忙。
1 + 1 = 2 => Twice the last value.
1 + 1 + 2 = 4 => Twice the last value.
1 + 1 + 2 +  ... + n = 2*n => Twice the last value.