期望这个循环是无限的,但事实并非如此

时间:2011-05-23 16:38:42

标签: java

这是我的Java代码:

public class Prog1 {
    public static void main(String[] args) {
        int x = 5;
        while (x > 1) { 
            x = x + 1;
            if (x < 3)
                System.out.println("small x");   
        }
    }
}

这是输出:

small x

我期待一个无限循环...任何想法为什么它会这样表现?

4 个答案:

答案 0 :(得分:6)

有一个无限循环。就在某个时候,x得到了一点,它溢出了一个有符号的int的限制,并且它变为负数。

public class Prog1 {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int x = 5;
        while (x > 1) { 
            x = x + 1;
            System.out.println(x);
            if(x < 3)
                System.out.println("small x");   
        }
    }
}

答案 1 :(得分:4)

x从5开始。然后当你循环时,它会转到6,7,8等。最终它会达到最大可能的int。下一个x = x + 1将其设置为最负的int,负20亿 - 无论如何。这小于3,因此输出消息。然后再次执行while条件,现在失败,退出循环。

所以虽然它似乎是一个无限循环,但事实并非如此。

这是作业问题吗?你为什么要编写这样奇怪的代码?

答案 2 :(得分:1)

X超出了int的限制。通过为x

添加println语句来检查值
public static void main(String[] args) {
// TODO Auto-generated method stub
int x = 5;
while (x > 1) { 
    x = x + 1;
    if(x < 3){
        System.out.println(x);
        System.out.println("small x");   
    }
}

我的jvm将x显示为 -2147483648

答案 3 :(得分:1)

Java整数已签名,并且它们溢出(如在C和许多其他语言中)。 试试这个来检查这种行为:

public class TestInt {
   public static void main(String[] args) {
     int x = Integer.MAX_VALUE;
     System.out.println(x);
     x++;
     System.out.println(x);
   }
}