1
PrintStream out = System.out;

    int sum = 0;
    for(int i = 0; i<5; i++)
        for(int j=i; j<5; j++)
            sum++;
    out.println(sum);

输出:15。我不知道这是如何得到 15。我试着在脑海中解决它,我一直得到 25。

如果我们忽略第二个 for 循环,并将 sum++ 放在第一个 for 循环中,你会得到 5。但是我们如何从第二个 for 循环中得到 15?

PrintStream out = System.out;

    int sum = 0;
    for(int i = 0; i<5; i++)
        for(int j=i; j<5; j++);
            sum++;
    out.println(sum);

输出: 1. 如果你把 ; 在 for 声明之后。它停止了吗?

4

4 回答 4

6
i = 0 => j goes from 0 to 4 => sum = 5  
i = 1 => j goes from 1 to 4 => sum = 5 + 4 = 9  
i = 2 => j goes from 2 to 4 => sum = 9 + 3 = 12  
i = 3 => j goes from 3 to 4 => sum = 12 + 2 = 14  
i = 4 => j goes from 4 to 4 => sum = 14 + 1 = 15 

您的第二个代码段无法按原样编译。

编辑

现在您的第二个代码段已编译:

for(int i = 0; i<5; i++)
    for(int j=i; j<5; j++);
        sum++;

相当于(这就是为什么你应该总是使用大括号):

for(int i = 0; i<5; i++) {
    for(int j=i; j<5; j++) {
    }
}
sum++;

这就解释了为什么它输出 1。

于 2012-08-15T23:28:16.590 回答
0

循环基本上是在创建一个三角数,特别是第 5 个三角数,例如 形式的数n + (n - 1) + ... + 2 + 1

诀窍以及您不到25结果的原因在于第二个循环:它仅从当前值迭代i5.

在内部循环的每次迭代中,总和都会增加一次。由于循环技巧,内部循环迭代了 5 次,然后是 4 次,依此类推:

first iteration of the outer loop: j = 0 to 4 -> 5 increments
second iteration of the outer loop: j = 1 to 4 -> 4 increments  
... 3 increments
... 2 increments
... 1 increment

5 + 4 + 3 + 2 + 1 = 15

于 2012-08-15T23:27:29.490 回答
0

输出为 15,因为在第一个循环的每次迭代中j被初始化为 的值。i

如果j改为初始化为零,则输出将为 25。

于 2012-08-15T23:27:56.970 回答
0

得到 25,而不是

    for(int j=i j<5; j++); // inner loop
        sum++;

采用

//......here
for(int j=0 j<5; j++); // inner loop
        sum++;

你现在做的是 (1+1+1+1+1) + (1+1+1+1) + (1+1+1) + (1+1) + (1),而你想要的是(1+1+1+1+1).. 5 times

ps为什么第二个代码中的循环是for(int j=il j<5; j++); il未定义,;即使您il之前已在某处定义,它也会停止。

于 2012-08-15T23:31:41.713 回答