5

我是java新手,所以嵌套循环中有一些我不明白的代码......

for(int i=0; i<3; i++){
 for(int j=1; j<3; j++){
   System.out.println(i + "" + j);
 }
}

它将运行:01,02,11,12,21,22

但是当我变成这个时:

int j=1;
for(int i=0; i<3; i++){
 for(; j<3; j++){
   System.out.println(i + "" + j);
 }
}

它变成这样:01,02

谁能给我解释一下?

4

5 回答 5

7

循环之间的区别在于,j 在顶部示例中每次都被重置,但在第二个示例中它保持其值。

在上面的示例中,每次内部 for 循环开始时 j 都被重新初始化为 1,因此它将遍历 1,2,3 值。当 j 达到 3 时,它将退出循环,这就是为什么您将 j 值视为 1 然后 2 的原因。每次外部循环运行时都会运行,为您的 i 值提供 0、1 和 2。

在底部示例中, j 永远不会重置,因此它只会增加。第一次通过循环,它会遍历 1、2、3 值并退出循环,为您提供您所看到的 01、02 值。由于它没有被重置,它保持为 3,因此当 i 增加时,内部循环将始终退出而不打印,从而为您提供所看到的输出。

要为底部示例获得相同的输出,您需要将值重置为 1,这基本上是 for 循环的第一个元素正在执行的操作。

int j = 1;
for(int i = 0; i < 3; i++) {
    j = 1; //reset the value each time through the outer loop
    for(; j < 3; j++) {
        System.out.println(i + "" + j);
    }
}
于 2013-08-22T05:02:51.710 回答
6

在您的第一个代码中

At case i=0

内循环以条件开始j=1

j=1 initialized **Condition satisfies** continue
j=2 incremented **Condition satisfies** continue
j=3 incremented **Condition Failed**    loop ends

内部首先执行它完整的循环并倾向于增加 i 现在 i=1

再次

j=1 initialized **Condition satisfies** continue
j=2 incremented **Condition satisfies** continue
j=3 incremented **Condition Failed**    loop ends

但是在您的第二个代码中, j 在外部声明,一旦 j 设置为 3,它就保持不变。所以第二个循环的条件失败了。

在情况 i=0

j=1 declared    **Condition satisfies** continue
j=2 incremented **Condition satisfies** continue
j=3 incremented **Condition Failed**    loop ends

在情况 i=1

j=3 Already set**Condition Failed**    loop ends

循环失败

于 2013-08-22T05:15:21.687 回答
5

它将打印 01, 02。原因是因为您没有重新初始化 j。所以在你的内循环的第二次迭代之后(when iis still 0, jis 3,所以它在你每次下一次外循环迭代的条件下都失败了。

在 for 循环声明中定义的变量范围非常窄。这意味着一旦循环完成所有迭代,它们就会死亡(并且需要重新初始化)。正如您在第二个示例中所做的那样,在方法主体中定义的变量将持续存在,直到方法本身结束。

于 2013-08-22T05:02:53.760 回答
3

代码 1:i 值为:0,1,2 j:1, 2

因此输出:01 02 11 12 21 22

但在代码 2 中:J 最初设置为 1,因此在 i 的第一次迭代中,即 For i=0 -> j=1, 2

但随后进行下一次迭代。j的值没有设置回1。所以j = 3。代码不能进入j的循环。

希望那是足够清楚的解释。

于 2013-08-22T05:10:34.080 回答
3

jfor在第二个编码块中未初始化。然后循环将从j' 的当前值开始。第一次for进入this,j是1,循环直到j是3。第二次for进入,j还是3,所以不满足循环条件,不执行循环体。以后的时间也是一样的。

于 2013-08-22T05:11:58.043 回答