为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕斯王 2023-05-10 15:16:55
我目前正在努力理解这个循环: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......
查看完整描述

5 回答

?
鸿蒙传说

TA贡献1865条经验 获得超7个赞

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

}

这与您当前的代码完全相同,它清楚地表明jwill stay at 3。


查看完整回答
反对 回复 2023-05-10
?
撒科打诨

TA贡献1934条经验 获得超2个赞

最初 j 的值为 0,当我们进入循环时为 3,但在最后一次迭代中我们并没有真正进入 X2 循环,因为 i<3 评估为 false。所以问题是为什么编译器“保存” k 的值?

j 在 main 的第一行声明。这意味着它将保留在范围内并保留所有修改,直到 main 结束并且变量被销毁。

即使编译器保存了上一次迭代的 j 值,它也应该是 2。

正如您上面所说,循环的最后一次迭代中 j 的值是 3 而不是 2。当您继续 X1 时,j-- 从未执行过。


查看完整回答
反对 回复 2023-05-10
?
慕工程0101907

TA贡献1887条经验 获得超5个赞

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

但是,我想建议您不要使用 continue 和 break 语句。导师非常不鼓励。它们会像您一样引起意大利面条式编程和混乱。


查看完整回答
反对 回复 2023-05-10
?
阿晨1998

TA贡献2037条经验 获得超6个赞

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

查看完整回答
反对 回复 2023-05-10
?
守着一只汪

TA贡献1872条经验 获得超3个赞

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;


查看完整回答
反对 回复 2023-05-10
  • 5 回答
  • 0 关注
  • 210 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信