4

我试图弄清楚为什么这个循环会终止......

@Test
public void test() {

    int counter=0;
    int from = 0;
    int until = Integer.MAX_VALUE;

    while(counter <= until) {
        counter++;
        if(counter < from) {
            System.out.println("continuing " + counter + " <= " + from);
            continue;
        } 
    }
    System.out.println("finished " + counter);
}

while(counter <= until)应始终解析为,true因为计数器不能增加到超过 Integer.MAX_VALUE。因此,循环不应终止。

但是,在 Eclipse 中,如果我使用 JUnit runner 运行,我会得到:

finished 108772

如果我在调试器中运行,我会得到:

finished 125156

中的输出if(counter < from)永远不会输出。如果我删除该块,代码仍然会终止,这次是 Integer.MAX_VALUE。

finished 2147483647
4

2 回答 2

0

我无法重现您的输出,所以这不是答案,只是观察。只考虑这些行。

int counter=0;
int until = Integer.MAX_VALUE;
while(counter <= until) {
    counter++;

while 条件是“小于或等于”。因此,当计数器等于 Integer.MAX_VALUE 时,会添加一个。这会产生最大可能的 Java 负数。继续向这个值加一,它最终会变为零,然后再次计数,直到达到 Integer.MAX_VALUE。然后整个序列重新开始。对我来说,它看起来像一个无限循环。

您还将在每次迭代中执行“继续”行,同时从最大的负数开始计数。

于 2013-04-03T19:19:22.643 回答
0

不太确定您在这里尝试做什么,您的 while 循环将按预期工作,但 from 永远不会改变,因此“计数器小于 from”永远不会被执行?

直到(最大 int)将 = 2147483647

如果将 while 循环更改为 (counter < until),则会得到“finished 2147483647”的输出文本

这种帮助?

于 2013-04-03T18:17:55.610 回答