为什么Java在break语句后不重置内部循环的值?

时间:2019-07-31 18:58:14

标签: java loops

我目前正在努力理解此循环:

class Test{
    public static void main(String args[]){
        int i=0, j=0;
        X1: for(i = 0; i < 3; i++){
            X2: for(j = 3; j > 0; j--){
                if(i < j) continue X1;
                else break X2;
            }
        }
        System.out.println(i+" "+j);
    }
}

到目前为止,我知道该变量的值将为:

 0 3 
 1 3 
 2 3 

,最后将打印3 3

在第三次迭代之后,X1上的条件将为false,从而导致循环语句中断。尽管我很清楚为什么i的值等于3,但我不明白为什么j的值也等于3。最初,j的值为0,当我们进入循环时为3,但是在最后一次迭代中,我们并没有真正进入X2循环,因为i<3评估为假。所以问题是为什么编译器“保存” k的值?而且即使编译器保存了先前迭代中的j的值也应该是2 ...

5 个答案:

答案 0 :(得分:3)

j--在这里是无效代码,将永远无法访问。在这里考虑一下代码如何工作:

X2: for(j = 3; j > 0; j--){
    if(i < j) continue X1;
    else break X2;
}

如果在一种情况下您继续进入外部循环,则在另一种情况下您会退出该循环。实际上,该循环甚至从未经过一次迭代,因此您最好像这样编写:

int i=0, j=0;
X1: for(i = 0; i < 3; i++){
    j = 3;
    if(i < j) continue X1;  //This line does nothing at this point as well since the loop will iterate anyway
}

这与您当前的代码完全相同,其中清楚地表明j将停留在3

答案 1 :(得分:0)

for(j = 3; j > 0; j--)
您正在设置j=3j--直到下一个j循环才运行,该循环永远不会发生,因此不能为2。

答案 2 :(得分:0)

else break X2;

j--

永远不会到达。

'i'在循环中永远不能为3,因为外部循环的条件是i <3,因此内部循环只能执行

if(i < j) continue X1;

因为'j'总是从3开始并且i <= 2总是为true。因此,“ j”永远不会改变值,并且当i = 3时外部循环会中断,从而导致“ 3 3”。

i j
0 3
1 3
2 3
break occurs;
print i + j;

答案 3 :(得分:0)

  

最初,当我们进入循环时,j的值为0,但是在最后一次迭代中,由于i <3为假,所以我们没有真正进入X2循环。所以问题是为什么编译器“保存” k的值?

j在main的第一行声明。这意味着它将保留在范围内,并保留所有修改,直到主要目的和变量被破坏为止。

  

即使编译器保存了前一次迭代的j值也应该是2。

如上所述,循环的最后一次迭代中j的值为3而不是2。当您继续执行X1时,从未执行过j-。

答案 4 :(得分:0)

这是因为其他人提到的无效代码。您应该逐步调试程序,我不知道您使用的是哪个IDE,但它可能提供了此功能。

但是,我想建议您不要使用continue和break语句。辅导员强烈建议不要这样做。它们会像您一样引起意大利面条编程和混乱。