【问题标题】:How does a for loop work, specifically for(;;)?for 循环如何工作,特别是 for(;;)?
【发布时间】:2011-10-28 05:20:37
【问题描述】:

查看一些旧的公司代码,我发现了一个看起来像这样的 for 循环:

for (;;) {
    //Some stuff
}

我尝试了 Google,但找不到任何答案。我是在编程课上睡着了还是这是一个不寻常的循环?

【问题讨论】:

    标签: java loops syntax for-loop iteration


    【解决方案1】:

    java 中的for 循环具有以下结构 -

    for (initialization statement; condition check; update)
        loop body;
    

    如你所见,这里有四个语句——

    1. 初始化语句:该语句只执行一次,当第一次进入循环时。这是一个可选语句,意味着您可以选择将此字段留空。它通常用于某些初始化目的。
    2. 条件检查:这个语句可能是最重要的一个。它检查以验证某个表达式的计算结果是否为真。如果是,则循环执行继续。您可以选择将此字段留空,该字段将被评估为true
    3. 更新:此语句列表从左到右执行,通常用于增加/减少某些变量。
    4. 循环体:循环体,会根据条件检查的真值反复执行。

    基本上这就是执行的方式——首先,当第一次进入循环时,初始化语句执行一次。然后执行条件检查以查看它是否评估为真。如果是,则执行循环体,否则循环执行结束。之后,执行更新语句。接下来,再次执行条件检查,如果结果为真,则再次执行循环体,然后执行更新语句,然后再次执行条件检查......你得到了图片。

    现在谈谈你的for( ; ; ) 语法。它没有初始化语句,因此不会执行任何操作。它的条件检查语句也是空的,这意味着它在执行循环体之后评估为真。接下来,由于更新语句为空,因此不执行任何操作。然后再次执行条件检查,再次评估为真,然后整个过程将再次重复。

    所以你看,这基本上是一个无限循环,它没有初始化语句,其条件检查将始终评估为真,并且没有更新语句。这相当于 -

    while(true)
    {
        .....
    }
    

    这是java中另一种流行的循环结构。

    当您使用这样的无限循环时,请务必注意中断条件,因为在大多数情况下,您不能让循环无限期地运行。要打破这些循环,您可以使用break 语句。结构如下——

    if(some_condition_is_true)
        break;        // This will cause execution to break out of its nearest loop
    

    if(some_condition_is_false)
        break;
    

    【讨论】:

      【解决方案2】:

      这与:

      while(true) {
        //Some Stuff
      }
      

      基本上,无限循环的另一种语法。

      【讨论】:

      • 虽然我们被教导要避免使用无限循环,但我不止一次犯了 while(true) 的错误。
      • 我觉得他们有他们有用的时刻
      • 至少如果你使用 while(true) 阅读代码的人似乎更有可能理解它......
      • 当你在 5 秒内解释它时,只是浪费了 5 分钟阅读接受的答案。
      【解决方案3】:

      这些都是无限循环

      for(;;) {
         // endlessly
      }
      
      while(true) {
         // endlessly
      }
      
      do {
         // endlessly
      } while(true);
      

      【讨论】:

        【解决方案4】:

        这个循环没有保护并且作为一个while(true)循环。它将无限循环直到中断。

        【讨论】:

        • 我不应该想象这个堆栈溢出,因为没有堆栈返回到循环的开头。
        • 或抛出,或继续到外循环
        【解决方案5】:

        这是一个无限循环。不完全是好的编码,因为它不直观,实际上会编译或不会引发运行时错误。重写为while(true) { /* code */ } 将更具可读性以指示无限循环。

        【讨论】:

        • 你是对的,因为内联注释,我的代码不会像写的那样拾取右括号,但我只是想把它全部放在一行上。
        【解决方案6】:

        这是一个无限循环。初始化、条件和增量语句都是可选的,因此如果没有它们,这将始终再次循环(除非遇到中断或其他构造与之交互)。

        尽管我不确定 Java,this question 解释了如何在 .Net 中将空的 forwhile (true) 编译为完全相同的内容。如果 Java 也能做到这一点,我不会感到惊讶。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2022-07-07
          • 2022-01-03
          • 1970-01-01
          • 1970-01-01
          • 2012-10-20
          • 2023-04-08
          相关资源
          最近更新 更多