Java 如何继续工作?
我试图理解“继续”是如何工作的。我理解关键字的概念,但当我运行不同的程序时,它的工作方式不同:-/ 让我举几个例子: 如果我运行此程序:Java 如何继续工作?,java,for-loop,while-loop,break,continue,Java,For Loop,While Loop,Break,Continue,我试图理解“继续”是如何工作的。我理解关键字的概念,但当我运行不同的程序时,它的工作方式不同:-/ 让我举几个例子: 如果我运行此程序: int j = 0; int i = 0; LABEL1: for (; i < 3; i++) { if (true) continue; } intj=0; int i=0; 标签1:for(;i
int j = 0;
int i = 0;
LABEL1: for (; i < 3; i++) {
if (true)
continue;
}
intj=0;
int i=0;
标签1:for(;i<3;i++){
如果(真)
继续;
}
我的值是3。到现在为止,一直都还不错。
让我们添加一个外部循环:
int j = 0;
int i = 0;
LABEL2: for (; j < 3; j++) {
LABEL1: for (; i < 3; i++) {
if (true)
continue LABEL2;
}
}
intj=0;
int i=0;
LABEL2:for(;j<3;j++){
标签1:for(;i<3;i++){
如果(真)
继续LABEL2;
}
}
我的价值将是。。。0 !!
我不明白,如果continue与指向外部循环的标签一起使用,为什么我不会递增。有人能解释一下原因吗?
你在休息时有没有像这样的棘手的事情?还是用一段时间
我真的很感激你能提供的任何帮助
continue LABEL2;
导致只有外部循环增加。如果你有
LABEL2 : for(;j <3;j++){
LABEL1 : for(;i < 3; i++){
if (true)
continue LABEL1;
}
}
LABEL2:for(;ji
将在内环的末端增加。但是continue LABEL2
跳出内环,跳到外环的末端,因此i
不会增加;相反,只有j
增加,直到不再满足外环条件
当我们使用重写代码,而使用循环时,可能会变得更清晰:
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++;
}
intj=0;
int i=0;
而
语句结构的基本(j
BasicForStatement:
for ( [ForInit] ; [Expression] ; [ForUpdate] ) Statement
基本陈述:
for([ForInit];[Expression];[ForUpdate])语句
现在,从:
如果由于没有标签的continue
,语句的执行突然完成,则按顺序执行以下两个步骤:
首先,如果存在ForUpdate部分,将按从左到右的顺序计算表达式;如果有,则丢弃它们的值。如果ForUpdate部分不存在,则不采取任何操作
其次,执行另一个
迭代步骤
如果由于标签为L
的continue
导致语句执行突然完成,则有一个选择:
- 如果for
语句的具有标签L
,则按顺序执行以下两个步骤:
首先,如果ForUpdate部分存在,表达式将按从左到右的顺序求值;如果有值,则丢弃它们。如果ForUpdate不存在,则不采取任何操作
其次,执行另一个
迭代步骤
如果for
语句没有标签L
,则for
语句会因为继续标签L
而突然完成
(强调矿山)
在您的情况下,ForUpdate是i++
。基于上述内容:
- 您的第一个代码段属于第一种情况,因此
i
是递增的
- 您的第二个代码段属于第二种情况,因此
i
不会递增,因为for
语句突然完成
请注意,如果在第二个代码段中有continue LABEL1
,i
会像在第一个代码段中一样递增(根据JLS)
作为未来的提示,要获得关于语言规则/语义的明确答案,您应该始终参考语言规范。对于Java,这是最基本的。这是非常正常的。执行流程如下所示:
int j=0;
int i = 0;
LABEL1 : for(;i < 3; i++){
if (true) {
continue;
}
someOtherMethod();
}
j=0
i=0
已输入标签2循环
已输入标签1循环
继续标记2
j++
已输入标签1循环
继续标记2
j++
已输入标签1循环
继续标记2
…直到j==3
如果在调试模式下运行,您将看到发生了什么。简而言之,每当您进入内部循环以增加i
,您将继续到LABEL2
,而不是增加i
,并进入内部循环的下一次迭代
因此,您将在外循环中停留3次,并且永远不会在内循环中点击i++
如果更简单,请将内部for循环想象为while循环:
int i = 0, j = 0;
LABEL2: for (; j < 3; j++) {
LABEL1: while (i < 3) {
if (true) {
continue LABEL2;
}
i++;
}
}
inti=0,j=0;
LABEL2:for(;j<3;j++){
标签1:while(i<3){
如果(真){
继续LABEL2;
}
i++;
}
}
Continue只是按照其名称执行,它立即继续执行循环的下一次执行,而不执行循环中的其余代码
while (getNext(line)) {
if (line.isEmpty() || line.isComment())
continue;
// More code here
}
如果你有这样一个循环:
int j=0;
int i = 0;
LABEL1 : for(;i < 3; i++){
if (true) {
continue;
}
someOtherMethod();
}
intj=0;
int i=0;
标签1:for(;i<3;i++){
如果(真){
继续;
}
someOtherMethod();
}
someOtherMethod部分永远不会执行,因为您将始终点击continue
计数器从不递增的原因与标签有关,您可以使用标签(在您的情况下是LABEL1
和LABEL2
标记一个循环,并使用该标签继续内部循环的一个外部循环
因此,对于您的代码,LABEL1
的循环从来没有机会增加其计数器,因此i
保持0
,因为您的continue语句立即继续到外循环的下一次迭代。如果这是代码,
例如:
int main (){
// Local variable declaration:
int a = 10;
// do loop execution
do
{
if( a == 15)
{
// skip the iteration.
a = a + 1;
continue;
}
cout << "value of a: " << a << endl;
a = a + 1;
}while( a < 20 );
return 0;
}
需要注意的一点:
“a:15的值”不在输出中。
在编程语言中continue跳过循环中的某一行,如果使用了“break”,则break仅在“14”之后离开该行(在本例中)。
为便于理解,请参见以下流程图:
i
在下次检查条件时递增
如果继续
或中断
循环,则不会再次检查条件,也不会增加
LABEL2 : for(;j <3;j++){
LABEL1 : for(;i < 3; i++){
if (true)
continue LABEL2;
}
}
LABEL1 : for(;i < 3; i++){
if (true)
break;
}
while (getNext(line)) {
if (line.isEmpty() || line.isComment())
continue;
// More code here
}
aLoopName: for (;;) {
// ...
while (someCondition)
// ...
if (otherCondition)
continue aLoopName;
for (count = 0; foo.moreData(); count++) continue;