use*_*432 29 java for-loop continue break while-loop
我试图了解"继续"的工作原理.我理解了关键字的概念,但是当我运行不同的程序时,它的工作方式不同: - /让我向您展示一些示例:
如果我运行这个程序:
int j = 0;
int i = 0;
LABEL1: for (; i < 3; i++) {
if (true)
continue;
}
Run Code Online (Sandbox Code Playgroud)
到目前为止,我的价值将是3.让我们添加一个外循环:
int j = 0;
int i = 0;
LABEL2: for (; j < 3; j++) {
LABEL1: for (; i < 3; i++) {
if (true)
continue LABEL2;
}
}
Run Code Online (Sandbox Code Playgroud)
我的价值将是... 0 !! 我不明白为什么如果继续使用带有转到外部循环的标签,我不会增加.有人能解释一下为什么吗?你有一些棘手的东西吗?还是做了一段时间?
我非常感谢您提供的任何帮助.
ars*_*jii 28
基本for陈述结构如下:
BasicForStatement: for ( [ForInit] ; [Expression] ; [ForUpdate] ) Statement
现在,来自JLS§14.14.1.3.突然完成for声明:
如果由于没有标签而突然完成Statement的执行,则按顺序执行以下两个步骤:
continue
首先,如果存在ForUpdate部分,则从左到右依次评估表达式 ; 它们的值(如果有的话)被丢弃.如果ForUpdate部分不存在,则不执行任何操作.
其次,
for执行另一个迭代步骤.如果由于带有标签而突然完成Statement的执行,则可以选择:
continueL
如果
for语句具有标签L,则按顺序执行以下两个步骤:
首先,如果存在ForUpdate部分,则从左到右依次评估表达式; 它们的值(如果有的话)被丢弃.如果ForUpdate不存在,则不执行任何操作.
其次,
for执行另一个迭代步骤.如果
for语句没有标签L,则for语句会因为标签的继续而突然完成L.
(强调我的)
ForUpdate,在您的情况下,是i++.基于以上内容:
你的第一个片段属于第一种情况,因此i会增加.
你的第二个片段属于第二种情况,所以i不会增加,因为 for语句突然完成.
请注意,如果您continue LABEL1在第二个代码段中i有所增加,则会在第一个代码段中增加(根据JLS).
作为未来的提示,关于语言规则/语义的明确答案,您应该始终参考语言规范.对于Java,那就是JLS.
小智 14
这很正常.exectuion流程如下:
i会在内循环结束时增加.但continue LABEL2跳出内环,到外环的末端,所以i没有增加; 而只是j增加,直到不再满足外循环条件.
当我们用while循环重写代码时,可能会更清楚:
int j=0;
int i = 0;
while (j<3) {
while(i<3) {
if (true)
goto END_OF_LOOP2;
END_OF_LOOP1: i++;
}
END_OF_LOOP2: j++;
}
Run Code Online (Sandbox Code Playgroud)
继续简单地做它的名字所暗示的,它会立即继续循环的下一次执行而不执行循环中的其余代码.
所以,如果你有这样的循环:
int j=0;
int i = 0;
LABEL1 : for(;i < 3; i++){
if (true) {
continue;
}
someOtherMethod();
}
Run Code Online (Sandbox Code Playgroud)
someOtherMethod部分永远不会执行,因为您将始终点击继续.
你的计数器永远不会增加的原因与标签有关,你可以用标签标记一个循环(在你的情况下LABEL1,LABEL2并使用该标签继续你的内循环的一个外循环.
因此,对于您的代码,循环LABEL1永远不会有机会增加其计数器,因此i仍然是0因为您的continue语句会立即继续到外循环的下一次迭代.
| 归档时间: |
|
| 查看次数: |
4762 次 |
| 最近记录: |