【问题标题】:nested while loops - outer vs inner conditions嵌套的while循环 - 外部与内部条件
【发布时间】:2013-04-08 07:10:48
【问题描述】:

在下面的例子中,在外循环条件变为假后,内循环是否继续执行它的语句 2?或者一旦外部while循环条件变为假,即使内部while循环的条件为真,整个循环也会退出,包括内部while循环?

while (becomes false){
    statements 1;
    statements 1;

      while ( true at the time the outer loop condition become false){
         statements 2;
         statements 2;   

         }
        }  
println("print something interesting");  

【问题讨论】:

  • 如果条件为假,则不执行循环。所以如果不满足外循环的条件,它就不会执行它的主体。
  • 对不起,我的意思是说外循环条件在某个时间点变为假。
  • 除非您在内部循环之前或内部更改值,否则它仍然会运行直到完成。

标签: java


【解决方案1】:

这可能有助于理解 while 循环的工作原理。如果你写:

while(myCondition) {
    doSomething();
    doSomethingElse();
}
println("print something interesting");

那么它基本上就变成了(伪代码):

1. if myCondition continue to line 2, else go to line 5
2.     doSomething()
3.     doSomethingElse()
4.     go to line 1
5. println "print something interesting"

如您所见,仅在第 1 行检查条件。例如,如果 myCondition 在第 2 行变为 false,则没有任何东西可以使块短路。 (如果需要,您必须手动重新测试 myCondition 并调用 break 如果它是错误的。)即使 doSomething()while 循环、for 循环或其他任何东西替换,这也是正确的否则。

因此,如果“语句 2”使外部循环条件为假,则不会停止。程序将继续进行下去,直到内循环完成,此时外循环完成它的迭代(因为在外循环块内的内循环之后没有任何内容)并返回重新测试它的条件以查看它是否应该开始另一个迭代。只有这样外循环才会检查它的条件。

为了更明确一点,下面是您的代码的基本工作方式:

1. if outer-condition continue to line 2, else go to line 9
2.    statements-1
3.    statements-2
4.    if inner-condition continue to line 5, else go to line 8
5.        statements-2
6.        statements-2
7.        go to line 4
8.    go to line 1
9. println "print something interesting"

因此,在第 1 行检查外部条件。如果它在任何时候变为 false,循环甚至不会注意到,直到它到达第 1 行,这只会发生一次到达第 8 行(或者第一次到达第 1 行以启动 while 循环,当然)。

【讨论】:

  • 感谢您的帮助,非常感谢您花时间向我解释这一点。
【解决方案2】:

只有在外循环为真时,内循环才会被执行(测试条件)。否则如果外循环中断,嵌套循环就没有机会被执行。

【讨论】:

    【解决方案3】:

    首先,while 循环条件仅在每次迭代开始时检查。

    如果在外循环迭代开始时,条件为false,则将 contol 转移到外循环之后的语句,从而绕过内循环。

    【讨论】:

    • 所以一旦外循环的条件变为假,它甚至不会检查内循环的条件?
    【解决方案4】:

    将代码块(又名大括号)中的代码想象成一扇门。如果您不符合进入门的要求,那么您将看不到里面的任何东西。所以没有内循环(因为外循环为假)不会执行。

    【讨论】:

      【解决方案5】:

      使用局部变量来控制循环,以便您可以在循环 2 中检查该值。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-10-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多