虽然循环没有Java的身体

时间:2014-09-10 18:42:49

标签: java while-loop

的主体(或任何其他Java循环)可以为空。这是因为null语句(仅由分号组成的语句)在Java中在语法上是有效的。 现在考虑一下:

i = 100     

j = 200   

while(++i < --j); // no body in this loop  

  system.out.println(i);         

  system.out.println(j);      

我注意到,如果i的值小于j,则循环重复自身,当条件未能满足时,则只有下面的2个语句被提供。我是正确的还是这背后还有其他任何逻辑?

5 个答案:

答案 0 :(得分:7)

是的,它会继续重复而不执行任何其他声明。

它将测试条件101 < 199102 < 198等,直到它测试150 < 150。然后它突破循环并执行println语句。

输出:

150
150

请注意,它不是无限循环的唯一原因是条件本身会使用++--运算符更改值。

答案 1 :(得分:7)

已经给出的答案是正确的。

但是我想指出,循环没有正文是不正确的。编译后你必须考虑它。它变成了:

  1. 以100
  2. 初始化我
  3. 初始化j为200
  4. 增量i
  5. 减少j
  6. IF NOT(I&lt; J)跳到7
  7. 跳至3
  8. 打印和填充
  9. 这种情况下的循环从3到6,并且有一个体(增量i递减j)和点5处的条件检查。

    为了更清楚,我会写另一个循环,功能完全相同,但有一个正文:

    while (true) {
      i++;
      j--;
      if (!(i<j)) break;
    }
    

    现在这个循环有一个主体,但可能是这个循环的编译版本和前一个循环相同。

    但是,我们可以通过&#34;空体循环&#34;一个没有副作用的循环。例如,这个循环:

    for (int i = 0; i < 10000; i++);
    

    这个循环是真的&#34;空的:无论你是否执行它,它都不会给程序的其余部分提供任何东西(如果不是延迟的话)。

    所以,我们可以定义它&#34;没有任何意义&#34;超过&#34;没有任何身体&#34;。

    在这种情况下,JIT会注意到它并将其擦除。

    从这个意义上说,你的循环可能是:

    for (int i = 100, j = 200; i < j; i++, j--);
    

    这里,因为&#34; i&#34;和&#34; j&#34;声明&#34;内部&#34;循环(不存在于它的范围之外),然后这个循环没有意义,并且将被消灭。

    也许这就是Herbert Shildt(我承认我不知道)意味着什么?

    另见Java: how much time does an empty loop use?关于空循环和JIT。

答案 2 :(得分:2)

是。布尔表达式将在每次迭代时进行计算,当结果为false时,循环将终止。此外,它System.out.println还没有system.out.println

答案 3 :(得分:0)

你是对的。循环将执行循环体(没有循环体),直到满足while条件,然后它将跳出循环并按顺序执行接下来的2个语句。

答案 4 :(得分:0)

我想补充一点,您应该省略while循环下面两个语句(println语句)的缩进。您不应将其视为条件语句,例如if语句。