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



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

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上的条件将是错误的,从而导致循环语句的中断。虽然我很明显i的值等于3,但我不明白为什么J的值也为3。最初,j的值是 0,当我们输入循环时是 3,但是在上次迭代中,我们并不是在X2循环中真正输入,因为i<3评估了false。因此,问题是为什么编译器"保存" k的值?即使编译器从上一个迭代中保存j的值也应为2 ...

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

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

else break X2;

j--

永远不会达到。

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

if(i < j) continue X1;

由于'j'总是从3开始,而i&lt; = 2始终是正确的。因此,'j'永远不会更改值,当i = 3时,外循环断开,导致" 3 3"。

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

最初,当我们进入循环时,j的值为0,但是在最后一个迭代中,我们并不是在x2循环中真正输入,因为i&lt; 3; 3评估false。因此,问题是为什么编译器"保存" k的值?

的值

J在Main的第一行中声明。这意味着它将保留在范围内并保留任何修改,直到主末端并破坏变量为止。

,即使编译器从上一个迭代中保存J的值也应为2。

正如您上面说的,循环的最后一次迭代中J的值为3,而不是2。

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

但是,我想建议您不要使用继续和打破语句。讲师高度劝阻它。它们会像您一样引起意大利面条编程和困惑。

最新更新