当RHS == Integer.MAX_VALUE时,整数的布尔比较,为什么这个循环终止?

时间:2013-04-03 18:08:13

标签: java openjdk eclipse-jdt

我正在试图解决为什么这个循环终止......

@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运行器运行,我得到:

finished 108772

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

finished 125156

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

finished 2147483647

2 个答案:

答案 0 :(得分:0)

不确定你在这里尝试做什么你的while循环将按预期工作但是from永远不会改变所以“counter to than”永远不会被执行?

直到(max int)将= 2147483647

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

有帮助吗?

答案 1 :(得分:0)

我无法重现你的输出所以这不是一个答案,只是一个观察。请考虑这些问题。

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

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

您还可以在每次迭代时执行'continue'行,同时从最大负数开始计算。