为什么这个 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 ;
}
我不明白为什么 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 ;
}