为什么这个Java循环不会终止?

时间:2016-12-09 08:21:18

标签: java for-loop terminate

我无法理解为什么Java中的循环不会终止。

long i = 26L ;
long j = 24L ;
for (long x = 0L ; x < 1000L ; x++) {
    i = i / 12 + 23 * (--x ) ;
    j = (x--) + j + 5 ;
}

3 个答案:

答案 0 :(得分:5)

在循环的每次迭代中,您递减计数器x 两次。这实际上意味着循环的上限永远不会被击中。实际上,即使在第一次迭代之后,计数器也应该变为负数。

这是你可能想做的事情:

for (long x = 0L ; x < 1000L ; x++) {
    long xTemp = x;
    i = i / 12 + 23 * (--xTemp ) ;
    j = (--xTemp) + j + 5 ;
}

或者可能是这样:

for (long x = 0L ; x < 1000L ; x++) {
    i = i / 12 + 23 * (x-1L) ;
    j = (x-1L) + j + 5 ;
}

一般来说,如果你将x指定为for循环计数器,那么你就不应该在循环中乱搞它作为一个好习惯。你可以在循环中使用它的值,但让循环本身来管理它。

答案 1 :(得分:0)

关键是x--做什么......以及x ++的作用。 x永远不会达到1000L。

答案 2 :(得分:0)

  

我无法理解为什么Java中的循环没有终止。

好吧,变量 x 从零开始,并且在每次迭代时,它的值将增加1(通过执行 x ++ )但减少两次(通过执行 --x )算法将在每次迭代后 x 减少1时结束,

从技术上讲,x将是负数,然后 UNDERFLOWS ,在下溢 x 的那一点将再次大于零,然后这个条件将为真: x&lt; 1000L

for (long x = 0L ; x < 1000L ; x++) {
    i = i / 12 + 23 * (--x ) ;
    j = (x--) + j + 5 ;
}