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


慕斯王
浏览 211回答 5
5回答

鸿蒙传说

j--这里是死代码,永远无法访问。想一想这段代码是如何工作的:X2: for(j = 3; j > 0; j--){&nbsp; &nbsp; if(i < j) continue X1;&nbsp; &nbsp; else break X2;}如果在一种情况下你继续到外循环,在另一种情况下你会跳出这个循环。这个循环实际上从来没有超过一次迭代,所以你不妨这样写:int i=0, j=0;X1: for(i = 0; i < 3; i++){&nbsp; &nbsp; j = 3;&nbsp; &nbsp; if(i < j) continue X1;&nbsp; //This line does nothing at this point as well since the loop will iterate anyway}这与您当前的代码完全相同,它清楚地表明jwill stay at 3。

撒科打诨

最初 j 的值为 0,当我们进入循环时为 3,但在最后一次迭代中我们并没有真正进入 X2 循环,因为 i<3 评估为 false。所以问题是为什么编译器“保存” k 的值?j 在 main 的第一行声明。这意味着它将保留在范围内并保留所有修改,直到 main 结束并且变量被销毁。即使编译器保存了上一次迭代的 j 值,它也应该是 2。正如您上面所说,循环的最后一次迭代中 j 的值是 3 而不是 2。当您继续 X1 时,j-- 从未执行过。

慕工程0101907

这是因为其他人提到的死代码。您应该逐步调试您的程序 我不知道您使用的是哪个 IDE,但它可能提供此功能。但是,我想建议您不要使用 continue 和 break 语句。导师非常不鼓励。它们会像您一样引起意大利面条式编程和混乱。

阿晨1998

for(j = 3; j > 0; j--)您正在设置j=3.&nbsp;j--直到下一个 j 循环才运行,它永远不会发生,所以它不能是 2。

守着一只汪

else break X2;和j--永远不会被达到。'i' 在循环内永远不能为 3,因为外循环的条件是 i < 3,因此内循环只能执行if(i < j) continue X1;因为 'j' 总是从 3 开始并且 i <= 2. 总是正确的。所以 'j' 永远不会改变值,并且当 i = 3 时外循环中断,结果是“3 3”。i j0 31 32 3break occurs;print i + j;
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java