Java - While循环(帮我理解流程)

时间:2014-08-31 14:38:17

标签: java while-loop

当我运行此代码时,我收到无法解决的声明错误。但是如果我将false改为true(在第二次),则输出为:“1 0”并继续执行。 里面发生了什么???

int m=2;
while (m >0)
{
 m =m -1;
 System.out.println(m);
} while (false);

输出:“错误:无法访问的声明”

但是,如果,

int m=2;
while (m >0)
{
 m =m -1;
 System.out.println(m);
} while (true);

输出:“1 0”

提前致谢...

2 个答案:

答案 0 :(得分:5)

你的例子都很奇怪,我的问题是......

while (m >0)
{
 m =m -1;
 System.out.println(m);
} while (false);

......实际上意味着

while (m >0)
{
 m =m -1;
 System.out.println(m);
}

// another while statement
while (false)
    ; //  loop's body - empty statement

因此,永远不会到达第二个while语句的主体(分号=空语句)。

如果你把true放在那里,你已经无限循环了 - 不确定这是不是你的目标。

我相信您将do {...} while(...);语法与while(...) {...}混淆了,并创造了两者的混合。

答案 1 :(得分:2)

让我们稍微格式化你的代码:

int m = 2;
while (m > 0) {
    m = m - 1;
    System.out.println(m);
}
while (false)
    ;

如您所见,此处有两个循环,首先是while (m > 0)和第二while (false)。让我们关注第二个循环

while (false)
    ;

这里有两个错误

  1. 这个循环永远不会迭代,因为它的条件总是 false 所以永远不会达到应该执行的潜在代码(它是无法访问的语句)。
  2. 即使此循环中的条件可以被评估为 true ,它也没有执行指令(分号为空之前的指令)所以这个循环相当于

    while (false){
        //nothing 
    }
    
  3. 现在您看到有关无法访问的语句的错误的原因是因为根据Java Language Specification 14.21

      

    如果由于无法访问语句而无法执行该语句,则为编译时错误。


    现在,如果你将这个循环中的条件更改为while (true)此循环内部无法访问语句的问题将消失,但会发生两件坏事

    1. 你最终会创建无限循环,除了占用处理器时间之外什么也不做。

      while (true){
          //will do nothing forever
      }
      
    2. 因为这个无限循环指令放在它之后无法访问,所以像

      while (true){
          //will do nothing forever
      }
      System.out.println("foo");//unreachable 
      

      将导致与以前相同的错误。