为什么我的 while 循环不终止?
Why won't my while loop terminate?
我注意到在我的 java 程序中使用 while 循环时,当使用布尔类型终止时它似乎不起作用。我输入了一些简单的东西来测试它。代码通过 i = 9 完成,然后 test 打印为 false。
public class LoopTesting {
public static void main(String[] args) {
boolean test = true;
while(test) {
for (int i = 1; i < 10; i++) {
System.out.println(i);
if(i == 5) test = false;
}
}
System.out.println(test);
}
}
编辑:为了回应 afzalex 的回答,我测试了这段代码:
while(test) {
for (int i = 1; i < 10; i++) {
System.out.println(i);
}
test = false;
for(int i = 11; i < 20; i++) {
System.out.println(i);
}
}
它打印到 19。
这就是你想要的
while(test) {
for (int i = 1; i < 10; i++) {
System.out.println(i);
if(i == 5) {
test = false;
break;
}
}
}
或更简单地说
int i = -1;
while(test) {
i++;
System.out.println(i);
if(i == 5) {
test = false;
}
}
您更改了 for 循环内的 test
值。但是 for
循环的条件是 i < 10
,而不是 test
.
所以 for
循环继续迭代直到结束。
然后当控件在 for
循环内时将 test
设置为 false
,while 终止。
你的逻辑有问题。在您的内部 for 循环完成之前,不会检查 test
变量。如果只想迭代5次,可以这样做:
while(test) {
for (int i = 1; i < 10; i++) {
System.out.println(i);
if(i == 5){
test = false;
break;
}
}
}
但你可能想做这样的事情:
...
int i = 1;
while(test) {
if(i == 5)
test = false
else i++;
}
while
循环未关闭的问题是因为代码中嵌入了 for
循环。会发生什么,你的代码将进入 while
循环,因为 while(test)
将导致 true
。然后,您的代码将进入 for
循环。在 for 循环中,代码从 1-10 循环。此循环基于 Integer
值 i
。内部循环基本上是说 while(i < 10)
,所以这个内部循环不受测试的 boolean
值的影响。
while(test) { // This loop will continue to run until test == false
for (int i = 1; i < 10; i++) { // This loop will continue to run until i > 9
test = false; // This will execute on the first loop of the inner loop, but it is not checked at the outer loop until the inner loop is complete
}
}
希望这是有道理的。您的问题是布尔值对应于外循环,没有什么可以阻止来自 运行.
的内循环
如果您将 while 和 for 替换为简单的 if/goto,您的第二个问题代码如下所示。也许这对你来说更容易理解:
loopA: // while
if (test) {
int i1 = 1;
loopB: // for 1
if (i1 < 10) {
System.out.println(i1);
i1++;
goto loopB;
}
test = false;
int i2= 11;
loopC: // for 2
if (i2 < 20) {
System.out.println(i2);
i2++;
goto loopC;
}
goto loopA;
}
System.out.println(test);
我注意到在我的 java 程序中使用 while 循环时,当使用布尔类型终止时它似乎不起作用。我输入了一些简单的东西来测试它。代码通过 i = 9 完成,然后 test 打印为 false。
public class LoopTesting {
public static void main(String[] args) {
boolean test = true;
while(test) {
for (int i = 1; i < 10; i++) {
System.out.println(i);
if(i == 5) test = false;
}
}
System.out.println(test);
}
}
编辑:为了回应 afzalex 的回答,我测试了这段代码:
while(test) {
for (int i = 1; i < 10; i++) {
System.out.println(i);
}
test = false;
for(int i = 11; i < 20; i++) {
System.out.println(i);
}
}
它打印到 19。
这就是你想要的
while(test) {
for (int i = 1; i < 10; i++) {
System.out.println(i);
if(i == 5) {
test = false;
break;
}
}
}
或更简单地说
int i = -1;
while(test) {
i++;
System.out.println(i);
if(i == 5) {
test = false;
}
}
您更改了 for 循环内的 test
值。但是 for
循环的条件是 i < 10
,而不是 test
.
所以 for
循环继续迭代直到结束。
然后当控件在 for
循环内时将 test
设置为 false
,while 终止。
你的逻辑有问题。在您的内部 for 循环完成之前,不会检查 test
变量。如果只想迭代5次,可以这样做:
while(test) {
for (int i = 1; i < 10; i++) {
System.out.println(i);
if(i == 5){
test = false;
break;
}
}
}
但你可能想做这样的事情:
...
int i = 1;
while(test) {
if(i == 5)
test = false
else i++;
}
while
循环未关闭的问题是因为代码中嵌入了 for
循环。会发生什么,你的代码将进入 while
循环,因为 while(test)
将导致 true
。然后,您的代码将进入 for
循环。在 for 循环中,代码从 1-10 循环。此循环基于 Integer
值 i
。内部循环基本上是说 while(i < 10)
,所以这个内部循环不受测试的 boolean
值的影响。
while(test) { // This loop will continue to run until test == false
for (int i = 1; i < 10; i++) { // This loop will continue to run until i > 9
test = false; // This will execute on the first loop of the inner loop, but it is not checked at the outer loop until the inner loop is complete
}
}
希望这是有道理的。您的问题是布尔值对应于外循环,没有什么可以阻止来自 运行.
的内循环如果您将 while 和 for 替换为简单的 if/goto,您的第二个问题代码如下所示。也许这对你来说更容易理解:
loopA: // while
if (test) {
int i1 = 1;
loopB: // for 1
if (i1 < 10) {
System.out.println(i1);
i1++;
goto loopB;
}
test = false;
int i2= 11;
loopC: // for 2
if (i2 < 20) {
System.out.println(i2);
i2++;
goto loopC;
}
goto loopA;
}
System.out.println(test);