我目前正在努力理解此循环:
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
...
答案 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=3
。 j--
直到下一个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语句。辅导员强烈建议不要这样做。它们会像您一样引起意大利面条编程和混乱。