[英]Why Java doesn't reset the values of the inner loop after a break statement?
我目前正在努力理解此循环:
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
,但是在最后一次迭代中,由于i<3
假,所以我们并未真正进入X2
循环。 所以问题是为什么编译器“保存” 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=3
。 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 j
0 3
1 3
2 3
break occurs;
print i + j;
最初,j的值为0,当我们进入循环时为3,但是在最后一次迭代中,由于i <3为假,因此我们并未真正进入X2循环。 所以问题是为什么编译器“保存” k的值?
j在main的第一行声明。 这意味着它将保留在范围内,并保留所有修改,直到主要目的和变量被破坏为止。
即使编译器保存了前一次迭代的j值,也应为2。
如上所述,循环最后一次迭代的j值为3而不是2。当您继续执行X1时,从未执行过j--。
这是因为其他人提到的无效代码。 您应该逐步进行调试程序,我不知道您使用的是哪个IDE,但它可能提供了此功能。
但是,我想建议您不要使用继续和中断语句。 辅导员强烈建议不要这样做。 它们会导致像您一样的意大利面条编程和混乱。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.