我正在做Sierra-Bates SCJP学习指南,并对以下问题感到疑惑:
public class Wind {
public static void main(String[] args) {
foreach:
for(int j=0; j<5; j++) {
for(int k=0; k< 3; k++) {
System.out.print(" " + j);
if(j==3 && k==1) break foreach; //1
if(j==0 || j==2) break;
}
}
}
}
当k的值等于1并且执行break foreach时(在第1行),在此之后迭代的确切位置,在我看来,这现在退出整个循环。下一个迭代点在哪里?如果退出外部循环,还有什么进一步的迭代? 研究书中给出的答案是0111233.我看到它的方式,在整个循环退出之前只打印01。不是吗?
答案 0 :(得分:1)
在此之后迭代的确切位置,我的脑海里现在就这样做了 退出整个循环
是的,因为你正在打破外循环。所以,它会退出你可以说的整个循环。
下一个迭代点在哪里?
中断外循环后没有迭代。
如果退出外部循环,还有什么进一步的迭代?
不,不会有任何进一步的迭代。为什么你会期待任何进一步的迭代?当你突破循环时,那个循环的进一步迭代将不会运行。
要获取输出,请尝试逐步执行代码。拿出纸和笔,每次迭代时写下j and k
的值,然后查看每次执行if
。
请注意,你的第二个if只是打破了内部for循环。
以下是您的两个条件: -
if(j==3 && k==1) break foreach; // 1
if(j==0 || j==2) break; // 2
迭代: -
1)。 j = 0, k = 0
: - 打印0.第一个if
失败,第二个if
成功。你打破了内循环。继续外部(j++)
2)。 j = 1, k = 0
: - 打印1.首先if
失败,第二if
失败。继续内循环(k++)
3)。 j = 1, k = 1
: - 打印1. if
都失败了。继续内循环(k++)
4)。 j = 1, k = 2
: - 打印1. if
都失败了。继续内循环(k++)
5)。 j = 1, k = 3
: - 内循环条件失败。继续外循环(j++, k = 0)
6)。 j = 2, k = 0
: - 打印2.首先if
失败。第二个if
成功。打破内循环。继续外循环(j++)
7)。 j = 3, k = 0
: - 打印3. if
都失败了。继续内循环。 (k++)
8)。 j = 3, k = 1
: - 打印3.首先if
成功。打破外循环。迭代结束。
现在看看,什么是印刷语句: -
0111233
答案 1 :(得分:0)
通过更好的打印,这可能会更容易看到:
public class Temp {
public static void main(String[] args) {
foreach: for (int j = 0; j < 5; j++) {
System.out.println("Outer(j=" + j + ")");
for (int k = 0; k < 3; k++) {
System.out.println("Inner (j=" + j + "; k=" + k +")" );
if (j == 3 && k == 1) break foreach; // 1
if (j == 0 || j == 2) break;
}
System.out.println("Outer - after inner loop");
}
System.out.println("Not in a loop");
}
}
一般规则是break语句将执行移动到其后的循环之外的第一个语句。当循环本身是另一个循环体中的最后一个语句时,这可能有点混乱,因为内循环后面的语句是外循环的循环机制(即while循环的测试或者动作和测试一个for循环)
非限定的break语句退出内部循环,然后完成外部循环的当前迭代(在“内部循环之后”)。
限定的break语句退出外部循环并转到外部for循环后面的第一个语句。
这会产生以下输出。
Outer(j=0)
Inner (j=0; k=0)
Outer - after inner loop
Outer(j=1)
Inner (j=1; k=0)
Inner (j=1; k=1)
Inner (j=1; k=2)
Outer - after inner loop
Outer(j=2)
Inner (j=2; k=0)
Outer - after inner loop
Outer(j=3)
Inner (j=3; k=0)
Inner (j=3; k=1)
not in a loop