的主体(或任何其他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个语句被提供。我是正确的还是这背后还有其他任何逻辑?
答案 0 :(得分:7)
是的,它会继续重复而不执行任何其他声明。
它将测试条件101 < 199
,102 < 198
等,直到它测试150 < 150
。然后它突破循环并执行println
语句。
输出:
150
150
请注意,它不是无限循环的唯一原因是条件本身会使用++
和--
运算符更改值。
答案 1 :(得分:7)
已经给出的答案是正确的。
但是我想指出,循环没有正文是不正确的。编译后你必须考虑它。它变成了:
这种情况下的循环从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语句。