java - 为什么我在无限循环代码中有不同的结果
问题描述
我有代码:
public static void main(String[] args) {
int i=0;
while(true){
i++;
System.out.println(i); //(1)
if(i==-1){
break;
}
}
}
如果有代码(1),它将在无限循环中运行,但如果没有代码(1),则代码不能在无限循环中运行,并且就像没有循环一样没有错误,但是如果我在调试模型中运行,它可以无限循环运行。
那么为什么会有这个结果。
我的IDE是idea,java1.8
解决方案
此代码不是无限循环。
i
由于整数溢出,最终将变为负数。它将溢出到Integer.MIN_VALUE
,并最终达到-1。
但是,当您包含该打印语句时,需要很长时间才能完成(它必须打印超过 40 亿个 的值i
),因此它似乎是无穷无尽的。
当您删除打印语句时,它会变得更快。
也就是说,如果编译器决定循环什么都不做,它甚至可能决定优化整个循环,这会将运行时间减少到 0。
如果您添加一个仅打印少数值的条件,您可以看到即使使用该println
语句,循环也会终止,这将使执行速度更快。
例如,每 1 亿个值打印一次:
public static void main(String[] args) {
int i=0;
while(true) {
i++;
if (i%100000000 == 0) System.out.println(i);
if(i==-1){
break;
}
}
}
将输出:
100000000
200000000
300000000
400000000
500000000
600000000
700000000
800000000
900000000
1000000000
1100000000
1200000000
1300000000
1400000000
1500000000
1600000000
1700000000
1800000000
1900000000
2000000000
2100000000
-2100000000
-2000000000
-1900000000
-1800000000
-1700000000
-1600000000
-1500000000
-1400000000
-1300000000
-1200000000
-1100000000
-1000000000
-900000000
-800000000
-700000000
-600000000
-500000000
-400000000
-300000000
-200000000
-100000000
并终止。
推荐阅读
- jquery - Django:如何使用 AJAX 根据其他字段下拉选项动态生成表单字段值?
- java - 如何通过使用 scala 类扩展我的 java 类来使其可写?
- uitableview - 基于其内容的表格视图高度
- websphere - AuthenticationException:[LDAP:错误代码 49 - 80090308:LdapErr:DSID-0C0903A8,注释:AcceptSecurityContext 错误,数据 52
- openedx - 如何编辑我的openxx主页?
- javascript - 用 facebook 誓言要求凭证/帐户
- c# - 使用 Ajax 传递 ViewModel ASP.NET MVC
- deep-learning - 分割掩码 RCNN 和 FPN
- javascript - 无法使用 API 在 Hubspot 中获取对象的属性值
- python - Pyglet - 获取声音频率