【问题标题】:Why does code execute after an empty infinite loop?为什么代码在一个空的无限循环之后执行?
【发布时间】:2021-08-18 10:57:48
【问题描述】:

我为此搜索了谷歌和堆栈溢出,但我没有得到这个问题的任何答案。 在这里,在这段代码中有一个空的无限循环,然后打印“Hello,World”。 从理论上讲,在无限循环之后,不应在无限循环之后打印任何内容。但是当我们运行代码时,它会打印“Hello, World”。 那么,为什么代码是在执行完无限循环之后写的呢?

public class Main{
    public static void main(String[] args){
        for(int i=0; i>=0; i++){}
        System.out.println("Hello, World");
    }
}

谢谢。

【问题讨论】:

  • 考虑在该循环中放置一个打印语句。看看它实际达到的数字,看看停止点是否有任何意义。
  • 或者在循环外声明i并在循环后打印i以查看其值。
  • 你为什么认为这是一个无限循环?您是否相信 int 值可以以某种方式计算到无穷大?
  • 你应该看看整数上溢和下溢是什么。

标签: java infinite-loop


【解决方案1】:

当 i 大于最大值(2147483648 - 可以用 32 位表示)时,它会溢出到它的最小值。 它运行 exaclty Integer.MAX_VALUE 次,因为 Integer.MAX_VALUE + 1 是 Integer.MIN_VALUE,一个负数。

您可以像这样可视化您的代码:

class Main {
public static void main(String[] args) {
    int i = 0;
    for(i=0; i>=0; i++){}
    System.out.println("Hello, World : "+ i);
}

}

【讨论】:

    【解决方案2】:

    此循环不是无限循环。直到i 到达Integer.MAX_VALUE。然后i 变为Integer.MIN_VALUE,这是一个负值。运行下面的代码并检查输出。

    int x = Integer.MAX_VALUE;
    x++;
    System.out.println(x);
    

    如果你想让循环无限使用,

    for ( ; ; ){
    }
    

    【讨论】:

      【解决方案3】:

      编译器变聪明了,知道在那个循环中什么都没做(这不重要,因为即使是 for 条件也可以编辑东西)

      或i 循环了 200 万次并溢出为负数,使其小于 0。

      【讨论】:

        猜你喜欢
        • 2013-07-25
        • 1970-01-01
        • 2011-02-19
        • 1970-01-01
        • 1970-01-01
        • 2013-08-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多