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

Why doesn't this Java 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 ;
}

在循环的每次迭代中,您递减 计数器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 循环计数器,那么作为一种良好做法,您不应该在循环中随意使用它。您可以在循环内使用它的值,但让循环本身管理它。

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

I can't understand why doesn't this loop in Java terminate.

嗯,变量 x 从零开始,每次迭代它的值都会增加 1(通过 x++)但是减少两次(通过 --x)算法将在每次迭代后 x 减少 1,

从技术上讲,当负数时 x 会是一些然后 UNDERFLOWS,此时下溢 x 将再次大于零然后这个条件将为真:x < 1000L

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