A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

© fengche 中级黑马   /  2013-10-20 15:27  /  1242 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  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,为什么?

评分

参与人数 1技术分 +1 收起 理由
李江 + 1 很给力!

查看全部评分

5 个回复

倒序浏览
因为for用了i <= END这个条件
i = END的时候,继续i++
int最高位变1,变成负数,开始从int最小值不断加直到符合了i=END以后
重复以上过程
也就是说条件一直是满足的

评分

参与人数 1技术分 +1 收起 理由
李江 + 1 赞一个!

查看全部评分

回复 使用道具 举报
本帖最后由 卜弦 于 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,所以循环还会继续,所以就一直没输出。

评分

参与人数 1技术分 +1 收起 理由
李江 + 1 很给力!

查看全部评分

回复 使用道具 举报

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。

评分

参与人数 1技术分 +1 收起 理由
李江 + 1 很给力!

查看全部评分

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