【问题标题】:Why do we use do-while loop when there are better loops available? [closed]当有更好的循环可用时,为什么我们使用 do-while 循环? [关闭]
【发布时间】:2014-05-13 16:59:15
【问题描述】:

我没有发现 do-while 循环的任何实际用途。作为一项研究,我们无法控制第一次执行的 do-while 循环,并且可以使用 do-while 循环完成的所有操作都可以使用 while 或 for 循环执行(假设)。

我的问题是:是否存在我们使用 do-while 循环的任何情况,或者与 for 和 while 循环相比它提供更可靠结果的任何特定情况?

【问题讨论】:

  • 你在评估结果之前执行了一些操作,但至少执行一次
  • 你也可以不用for循环来写任何东西,但有时它在语义上更好。
  • 当我们有递归时为什么会有循环?
  • 可读性被低估了。
  • @Ingo - “迭代是人类,递归是神圣的。” - L. Peter Deutch

标签: java loops do-while


【解决方案1】:

这对于重复一个动作直到正确为止很有用

String input;

...

do
{
    input = getInput();

} while(isValid(input));

要使用另一个循环来做到这一点,您必须写两次 input = getInput();

【讨论】:

  • 这是一个相当无用的循环,因为input 在循环退出时超出范围。在循环前声明变量input并否定条件;那么它实际上会很有用。
【解决方案2】:

do/while非常适合当你总是想至少执行一次,但你想检查是否在结束时继续执行 > 在循环中而不是在开始时。

您可以使用 while 循环轻松模拟它,但有时代码会变得不那么清晰。所有三种循环类型都可以相互模拟,或多或少有些混乱 - 但由于所有三种循环都可用,您应该为手头的工作选择最合适的循环。

我个人使用while 循环和do/while 循环的频率低于for 循环,但有时 do/while 是最易读的选项.

【讨论】:

    【解决方案3】:

    还不如说“我没有发现 for 循环的任何实际用途......所有可以用 for 循环完成的事情,都可以用 while 循环完成(假设)”。

    技术上你可以用任何其他循环替换任何循环,只要有足够的循环保护等。有些循环比其他循环更容易阅读。

    do-while 主要是“更好”,如果你想执行一个动作至少一次,例如要求输入,或获取一些随机值,直到它符合某些约束。您可以通过在“常规”循环之外执行操作并从那里循环来执行此类操作,但使用do-while 会更简洁。

    【讨论】:

      【解决方案4】:
      如果循环体必须执行至少一次,

      Do-while 通常具有更好的性能特征。如果将 do-while 重新表述为 while/for,则会添加对循环退出条件的额外评估。

      此外,do-while(false) 可用作深度嵌套 if 条件的结构化替代方案:

      do {
         if (!condition1)
             break;
         if (!condition2)
             break;
         if (!conditionN)
             break;
         // do something
      } while (false);
      

      代替:

      if (condition1) {
          if (condition2) {
              if (conditionN) {
                  // do something
              }
          }
      }
      

      【讨论】:

      • if(condition1 && condition2 && condition3)
      • 只有在条件简单时才实用。如果您需要导航关系并检查空值/条件,则它不适用。它还可能很快导致非平凡条件下的括号混乱。
      • 恕我直言,这是一段非常有问题的代码。你使用循环不是为了它的直接目的,它对我来说看起来很不寻常(而且,我相信,对于大多数开发人员来说),它让我认为这里应用了一些复杂的逻辑,而不仅仅是一些条件检查。这完全破坏了任何“代码美”的想法。我认为总有更好的解决方案 - 将复杂条件简化为几个布尔变量,或者创建一个单独的方法而不是 do-while 块(如果需要,您可以使用“return;”)等等。
      • @Durandal 考虑代码:if (condition1 && condition2)。如果condition1 为假,那么condition2 将永远不会真正被执行。这意味着您可以编写类似if(val != null && val.subval == otherVal) 的内容,并且不会中断。
      • 你只是坚持使用简单琐碎条件。那很好,但现实世界并不总是那么简单和精心设计。考虑一下:检查订单是否附加了额外的信息对象,如果是,请检查字段状态是否为“待定”并且该字段“职员”已设置,然后执行...(简单的商业规则)。 当然你可以写 if (order.getExtraInfo() != null && order.getExtraInfo().getStatus().equals(pending) && order.getExtraInfo().getClerk() != null) if ((ExtraInfo i = order.getExtraInfo()) != null && i.getStatue().equals(pending) && i.getClerk() != null)。
      猜你喜欢
      • 2022-12-12
      • 1970-01-01
      • 2016-03-27
      • 2011-03-10
      • 1970-01-01
      • 1970-01-01
      • 2013-12-26
      • 2020-08-28
      相关资源
      最近更新 更多