看似无穷无尽的循环终止,除非使用 System.out.println

2022-08-31 10:59:18

我有一个简单的代码,它应该是一个无限循环,因为将永远增长,并将永远大于。xj

int x = 5;
int y = 9;
for (int j = 0; j < x; j++) {
   x = x + y;
}
System.out.println(y);

但就像这样,它会打印并且不会无休止地循环。我不知道为什么。但是,当我按以下方式调整代码时:y

int x = 5;
int y = 9;
for (int j = 0; j < x; j++) {
    x = x + y;
    System.out.println(y);
}
System.out.println(y);

它变成了一个无休止的循环,我不知道为什么。Java是否识别出它是一个无限循环,并在第一种情况下跳过它,但必须在第二种情况下执行方法调用,以便它的行为符合预期?困惑的:)


答案 1

这两个例子都不是无穷无尽的。

问题在于Java(或几乎任何其他通用语言)中的类型限制。当达到 的值时,添加任何正值都会导致溢出,而变为负值,因此低于 。intx0x7fffffffxj

第一个循环和第二个循环之间的区别在于,内部代码需要更多的时间,并且可能需要几分钟才能溢出。对于第一个示例,可能需要不到第二个,或者很可能代码将被优化程序删除,因为它没有任何影响。x

正如讨论中提到的,时间将在很大程度上取决于操作系统如何缓冲输出,是否输出到终端仿真器等,因此它可能远远高于几分钟。


答案 2

由于它们被声明为int,因此一旦达到最大值,循环将中断,因为x值将变为负。

但是,当 System.out.println 添加到循环中时,执行速度将变得可见(因为输出到控制台会降低执行速度)。但是,如果您让第二个程序(循环中带有syso的程序)运行足够长的时间,则它应该具有与第一个程序相同的行为(循环中没有syso的程序)。