黑马程序员技术交流社区

标题: 循环 [打印本页]

作者: fengche    时间: 2013-10-20 15:27
标题: 循环
  1. public class InTheLoop {
  2.     public static final int END = Integer.MAX_VALUE;
  3.     public static final int START = END - 100;
  4.     public static void main(String[] args) {
  5.         int count = 0;
  6.         for (int i = START; i <= END; i++)
  7.             count++;
  8.         System.out.println(count);
  9.     }
  10. }
复制代码
从来都没有机会去打印count,为什么?
作者: 風諾    时间: 2013-10-20 15:40
因为for用了i <= END这个条件
i = END的时候,继续i++
int最高位变1,变成负数,开始从int最小值不断加直到符合了i=END以后
重复以上过程
也就是说条件一直是满足的
作者: 卜弦    时间: 2013-10-20 15:45
本帖最后由 卜弦 于 2013-10-20 15:46 编辑
  1. public class InTheLoop {
  2.     public static final int END = Integer.MAX_VALUE;
  3.     public static final int START = END - 100;
  4.     public static void main(String[] args) {
  5.         int count = 0;
  6.         for (int i = START; i <=END; i++)
  7.                         {
  8.                                 count++;
  9.                                 System.out.println(count);
  10.                         }
  11.     }
  12. }

复制代码
不是没有机会打印,而是一直在打印。你把count++和输出语句都放进循环里面像我这样。你就明白了。
但是这个程序是一个死循环。
如果你把for (int i = START; i <=END; i++)改为i <END就不会是死循环了。
因为,当i=MAX_VALUE时,循环好像是执行最后一次。但实际上i++还会执行,
而此时i=MAX_VALUE+1=0;i  在这一步被赋值为0,所以循环还会继续,所以就一直没输出。
作者: 月夜之鬼魅    时间: 2013-10-20 16:07

public class InTheLoop {

    public static final int END = Integer.MAX_VALUE;

    public static final int START = END - 100;

    public static void main(String[] args) {

        int count = 0;

        for (long i = START; i <= END; i++)

            count++;

        System.out.println(count);

    }

}

把int改成long就可以了,比较科学的说法是当循环到100遍时,i = Integer.MAX_VALUE,下一个循环i++,i由于是int类型,发生上溢,i = Integer.MIN_VALUE,当然小于END,于是i不断变大到Integer.MAX_VALUE,然后上溢变成Integer.MIN_VALUE,周而复始,一直循环下去。
所以问题出在int类型在该场合下表示范围太小,可以把i的类型从int换成long。

作者: Simple_love    时间: 2013-10-20 18:41
int类型最大取值范围在0~65535当超出这个范围取值之后,造成内存溢出,虽然循坏内部每次都加1 但是Java虚拟机根本就不会去相加的, 程序会一直会停留在哪里,虚拟机不知道怎么运行。所有count++只会运行一次,  初始值是0最后打印的也是0.
作者: To    时间: 2013-10-20 19:14
楼主你好,如果问题已解决请将帖子状态修改为提问结束,如果未解决请继续提问,谢谢合作
如果不会修改请看解释帖:http://bbs.itheima.com/thread-89313-1-1.html




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2