黑马程序员技术交流社区
标题:
循环
[打印本页]
作者:
fengche
时间:
2013-10-20 15:27
标题:
循环
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 (int i = START; i <= END; i++)
count++;
System.out.println(count);
}
}
复制代码
从来都没有机会去打印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 编辑
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 (int i = START; i <=END; i++)
{
count++;
System.out.println(count);
}
}
}
复制代码
不是没有机会打印,而是一直在打印。你把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