英文:
I don't understand the output of the following Java snippet with break + labels (like goto in other languages)
问题
我不理解以下代码的输出:
public class testBreak
{
public static void runTest()
{
high_level:
{
System.out.println("Enter in High Level");
middle_level:
for(int i = 0; i < 4; i++)
{
System.out.println("Enter in Middle level cicle");
int j = 0;
low_level:
while(j++ < 2)
{
System.out.println("Enter in Low level cicle");
System.out.println("i = " + i + "; j = " + j);
switch(i)
{
case 0 : break;
case 1 : break low_level;
case 2 : break middle_level;
case 3 : break high_level;
}
System.out.println("Exit from Low level cicle");
}
System.out.println("Exit from Middle level cicle");
}
System.out.println("Exit from High level cicle");
}
}
public static void main(String args[])
{
runTest();
}
}
以下是输出结果:
Enter in High Level
Enter in Middle level cicle
Enter in Low level cicle
i = 0; j = 1
Exit from Low level cicle
Enter in Low level cicle
i = 0; j = 2
Exit from Low level cicle
Exit from Middle level cicle
Enter in Middle level cicle
Enter in Low level cicle
i = 1; j = 1
Exit from Middle level cicle
Enter in Middle level cicle
Enter in Low level cicle
i = 2; j = 1
Exit from High level cicle
我理解到 i = 1; j = 1
,但为什么它会跳到 Exit from Middle level cicle
而不是 Enter in low level cicle
呢?因为我们有 j = 1
并且 while(j++ < 2)
应该成立(1 < 2),然后增加 j 到 2 并进入低级循环,就像在第一次运行时一样?
编辑:看起来使用标签的 break 不等同于 goto,它会跳出带有标签的循环?并且该循环不像在C/C++中一样自由地存在于代码中,而是应用于特定的循环?
英文:
I don't understand the output of the following code:
public class testBreak
{
public static void runTest()
{
high_level:
{
System.out.println("\nEnter in High Level");
middle_level:
for(int i = 0; i < 4; i++)
{
System.out.println("Enter in Middle level cicle");
int j = 0;
low_level:
while(j++ < 2)
{
System.out.println("Enter in Low level cicle");
System.out.println("i = " + i + ";j = " + j);
switch(i)
{
case 0 : break;
case 1 : break low_level;
case 2 : break middle_level;
case 3 : break high_level;
}
System.out.println("Exit from Low level cicle");
}
System.out.println("Exit from Middle level cicle");
}
System.out.println("Exit from High level cicle");
}
}
public static void main(String args[])
{
runTest();
}
}
Here is the output:
Enter in High Level
Enter in Middle level cicle
Enter in Low level cicle
i = 0;j = 1
Exit from Low level cicle
Enter in Low level cicle
i = 0;j = 2
Exit from Low level cicle
Exit from Middle level cicle
Enter in Middle level cicle
Enter in Low level cicle
i = 1;j = 1
Exit from Middle level cicle
Enter in Middle level cicle
Enter in Low level cicle
i = 2;j = 1
Exit from High level cicle
I understand up to the line i = 1;j = 1
but why does it go to Exit from Middle level cicle
and not to Enter in low level cicle
because we have j = 1 and while(j++ < 2) should take 1 < 2, then increase j to 2 and enter the low level cicle as it did in the first run??
editet: It seems break with label does not equal goto, it breaks out of the labeled loop? and the loop is not free in the code like in C/C++, but it is applied to that particular loop?
答案1
得分: 0
当i = 1
时,你告诉它跳出low_level
标签。在low_level
下方的循环停止循环,然后打印Exit from Middle level cicle
。通过这样做,你会再次在middle_level
循环下方进行循环,这就是为什么它然后打印Enter in Middle level cicle
。
英文:
When i = 1
, you are telling it to break out of the low_level
label. The loop below low_level
stops looping, and then prints Exit from Middle level cicle
. By doing this, you then loop again below the middle_level
loop, which is why it then prints Enter in Middle level cicle
.
答案2
得分: 0
来自Oracle的Java教程:
break语句终止了带有标签的语句;它不会将控制流转移到标签处。控制流会转移到终止的带有标签的语句后面的语句。
这个回答符合您的问题吗?
英文:
Taken from the Java tutorial by Oracle:
> The break statement terminates the labeled statement; it does not
> transfer the flow of control to the label. Control flow is transferred
> to the statement immediately following the labeled (terminated)
> statement.
Does this answer your question?
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论