如何读取嵌套的for循环?

时间:2014-11-10 17:25:56

标签: c for-loop

通过阅读代码,我无法理解这个for-loop的作用。我知道for循环是如何工作的。通过阅读此代码,我无法深入了解该程序可以做什么。

如果重要的话,我是从python到C来的。

#include <stdio.h>

int main (void)
{
    int numbers[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)
            numbers[j] += numbers[i];

    return 0;

}

for (j = 0; j < 10; ++j)

这只是意味着遍历数组的每个元素。这很容易理解。

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

这要困难得多!我认为这是因为我无法弄清楚j等于什么。我不能正确地遵循这两个循环。

我特别想知道如何在C中阅读和理解这个嵌套的for循环。

(我知道这个片段的作用是因为我编译并运行了代码。)

5 个答案:

答案 0 :(得分:3)

首先,让我们把它翻译成Python:

numbers = [1,0,0,0,0,0,0,0,0,0]
for j in range(10):
    for i in range(j):
        numbers[j] += numbers[i]

外部循环遍历numbers的所有十个元素,并且对于每个项目,将numbers中的所有之前的元素添加到当前一。 It's easier to follow if you add a few print statements

答案 1 :(得分:1)

for (j = 0; j < 10; ++j)并不代表&#34;迭代遍历数组的每个元素&#34;。它意味着&#34;对于从0到9的j的每个值,执行循环中的代码&#34;。

循环中的代码包含另一个循环:

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

因此,对于从0到9的j的每个值,将执行该内部循环。实际上,它就像顺序执行内循环10次:

for (i = 0; i < 0; ++i)
            numbers[0] += numbers[i];
for (i = 0; i < 1; ++i)
            numbers[1] += numbers[i];
for (i = 0; i < 2; ++i)
            numbers[2] += numbers[i];

......等等

(作为旁注,内部循环的第一次执行不执行任何操作,因为0不小于0.因此外部循环的初始值也可能为1.)

要返回原始的短语,如果外部循环基本上遍历数组的所有元素,则内部循环对外部循环中当前元素之前的数组的所有元素进行第二次迭代。

答案 2 :(得分:0)

有时候,只记出沿途发生的事情是有帮助的。此外,添加大括号也可能有所帮助:

for (j = 0; j < 10; ++j)
{
    for (i = 0; i < j; ++i)
    {
        numbers[j] += numbers[i];
    }
 }

(A)第一次通过外部循环,j将为零,因此内部循环将读取:

for (i=0; i < 0; ++i)

因为0不小于0,我们跳过内循环的主体(并且数字保持不变)。

(B)第二次通过外循环,j将为1,因此内循环将读取:

for (i=0; i < 1; ++i)

因此,当i为零时,我们将遍历内循环的主体,因此我们将执行此 命令; numbers[1] = numbers[1] + numbers[0];(为了更加清晰,我扩展了+ =)现在使数字数组看起来像这样:1,1,0,0,0,0,0,0,0,0

(C)第三次通过外循环,j将是两个,因此内循环将读取:

for(i=0; i < 2; ++i)

所以我们将通过内循环的主体两次,i为第一个零,然后是一个。从而 我们将执行以下命令:

numbers[2] = numbers[2] + numbers[0];
numbers[2] = numbers[2] + numbers[1];

将数字数组转换为1,1,2,0,0,0,0,0,0,0

等等。

希望这有帮助。

答案 3 :(得分:0)

j数组中的numbers元素是数组中所有前面元素的总和。从技术上讲,前面的元素将添加到 j元素,但numbers[j]从0开始。

j等于1时,

numbers[1] = numbers[1] + numbers[0]

使numbers[1] == 1.(因为i只能为0且numbers[0]为1)

j等于2时,

numbers[2] = numbers[2] + numbers[1] + numbers[0]

使numbers[2] == 2.(因为i可以是0和1,numbers[0]numbers[1]都是1)

j等于3时,

numbers[3] = numbers[3] + numbers[2] + numbers[1] + numbers[0]

使numbers[3] == 4.(因为i可以是0,1和2,numbers[2]是2)

因此,任何j - 1j> 1)元素等于其所有前面元素的总和。因此,随着循环的继续,j元素将最终成为j - 1元素的两倍。

在程序结束时,数组中的每个值都为1 1 2 4 8 16 32 64 128 256

答案 4 :(得分:0)

这是每个外部循环后数组的值

  1   0   0   0   0   0   0   0   0   0 
  1   0   0   0   0   0   0   0   0   0 
  1   1   0   0   0   0   0   0   0   0 
  1   1   2   0   0   0   0   0   0   0 
  1   1   2   4   0   0   0   0   0   0 
  1   1   2   4   8   0   0   0   0   0 
  1   1   2   4   8  16   0   0   0   0 
  1   1   2   4   8  16  32   0   0   0 
  1   1   2   4   8  16  32  64   0   0 
  1   1   2   4   8  16  32  64 128   0 
  1   1   2   4   8  16  32  64 128 256 

由此

生成
#include <stdio.h>
#define SIZE_ARRAY 10

void show_numbers(int size_array, int index, int given_array[]) {

    int i = 0;
    for (; i < size_array; i++) {

        printf("%3d ", given_array[i]);
    }

    printf("\n");
}

int main (void) {

    // static const int size_array = 10;
    int numbers[SIZE_ARRAY] = {1,0,0,0,0,0,0,0,0,0};
    int i, j;

    show_numbers(SIZE_ARRAY, 0, numbers);

    for (j = 0; j < SIZE_ARRAY; ++j) {

        for (i = 0; i < j; ++i) {

            numbers[j] += numbers[i];
        }

        show_numbers(SIZE_ARRAY, j, numbers);
    }
    return 0;

}