我目前正在努力了解此循环:
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=3
。j--
直到下一个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,但它可能提供此功能。
但是,我想建议您不要使用继续和打破语句。讲师高度劝阻它。它们会像您一样引起意大利面条编程和困惑。