【问题标题】:Are there any languages that have a do-until loop?是否有任何语言具有 do-until 循环?
【发布时间】:2011-09-30 21:25:16
【问题描述】:

是否有任何编程语言具有 do-until 循环?

例子:

do
{
    <statements>
}
until (<condition>);

基本上相当于:

do
{
    <statements>
}
while (<negated condition>);

注意:我正在寻找测试后循环。

【问题讨论】:

    标签: loops language-features do-loops


    【解决方案1】:

    Ruby 有直到。

    i=0
    begin
      puts i
      i += 1
    end until i==5
    

    【讨论】:

    • 这是一个完全不同的结构,因为它最初不会像 do-while 循环那样运行一次,无论 while/until 条件如何。
    • @Jake Petroules 是的,你是对的。我对其进行了修改,因此无论条件如何,它都会运行一次。
    • 所以 Ruby 也有 whileuntil 两种形式,很有趣。我想知道为什么更多的语言没有这样做。
    • Pascal 有重复直到,这意味着 Delphi 也有。
    • @Jake - 我想更多语言没有它的原因是有(几乎?)无限数量的不同控制结构可以使用。语言设计者需要选择他们想要包含在语言中的内容,以平衡复杂性/大小与便利性。
    【解决方案2】:

    VBA!

    Do-Until-Loop

    Do-Loop-Until

    虽然我认为这里的很多人会怀疑它是否是一种真正的语言,但是,BASIC 是微软的起点(我知道,对很多人来说,这个论点很弱)...

    【讨论】:

    【解决方案3】:

    在 VB 中我们可以找到类似的东西:

     Reponse = InputBox("Please Enter Pwd")
      Do Until Reponse = "Bob-pwr148" ...
    

    【讨论】:

      【解决方案4】:

      埃菲尔为您提供了一个直到循环。

      from 
        x := 1 
      until 
        x > 100 
      loop 
        ... 
      end
      

      还有一个“交叉”循环。两者都非常强大且富有表现力。

      这个循环的设计提供了更多。它的语法还有两个部分可以帮助我们解决两个重要的“正确性”问题。

      1. 无限循环保护。
      2. 迭代失败检测。

      无限循环保护

      让我们通过添加一个循环变体来稍微修改我们的循环代码。

      from 
        x := 1
        v := 1_000
      until 
        x > 100 
      variant
        v
      loop 
        ...
        v := v - 1 
      end
      

      循环变量(本质上)是一个倒计时变量,但不仅仅是任何旧变量。通过使用 variant 关键字,我们告诉编译器要注意 v。具体来说,编译器将生成代码来监视 v 变量的两个条件:

      1. v 是否会随着循环的每次迭代而减小(我们是否正在倒计时)。如果它(实际上)倒计时,那么尝试使用倒计时变量是没有用的,对吧?如果循环变量没有倒计时(减少任何数量),那么我们会抛出异常。

      2. v 是否曾经达到小于零的条件?如果是这样,那么我们抛出一个异常。

      这两者通过编译器和变体变量一起工作,以检测我们的迭代循环何时以及是否迭代失败或迭代次数过多。

      在上面的示例中,我们的代码正在向我们传达一个故事,它期望迭代 0 到 1_000 次,但不会更多。如果它更多,那么我们停止循环,这让我们想知道:我们是否真的存在迭代超过 1_000 次的情况,或者我们的条件未能变为真的有什么问题 True ?

      循环不变量

      既然我们知道了什么是循环变体,我们需要了解什么是循环不变量

      不变量是一组一个或多个布尔条件,在通过循环的每次迭代后必须保持。我们为什么要这些?

      假设您有 1_000_000 次迭代,其中一次失败。您没有时间遍历每个迭代,检查它是否正常。因此,您创建了一组一个或多个条件,这些条件在每次迭代完成时进行测试。如果其中一个或所有条件失败,那么您就可以准确地知道是哪个迭代(及其确定性状态)导致了问题!

      循环不变量可能类似于:

      from 
        x := 1
        y := 0
        v := 1_000
      invariant
        y = x - 1
      until 
        x > 100 
      variant
        v
      loop 
        ...
        x := x + 1
        y := y + 1
        v := v - 1 
      end
      

      在上面的例子中,y 在 x 后面加 1。我们希望在每次迭代之后,y 总是 x - 1。因此,我们使用 invariant 创建了一个 loop invariant 关键字声明我们的布尔断言。如果 y 不能为 x - 1,则循环将立即抛出异常,并让我们准确知道哪个迭代未能保持断言 True

      结论

      我们的循环现在非常紧凑和安全——很好地防范了失败(错误、错误)。

      【讨论】:

        【解决方案5】:

        在 VB.Net 中是可能的

        bExitFromLoop = False 
        Do  
            'Executes the following Statement  
        Loop Until bExitFromLoop 
        

        BS2000(富士通/西门子操作系统)上的 SDF-P 也可以

        / DECLARE-VARIABLE A
        / DECLARE-VARIABLE SWITCH-1(TYPE=*BOOLEAN)
        / SET-VARIABLE A = 5
        / SET-VARIABLE SWITCH-1 = ON
        / REPEAT
        /   A = A + 10
        /   IF (A > 50)
        /      SET-VARIABLE SWITCH-1 = OFF
        /   END-IF
        / UNTIL (SWITCH-1 = OFF)
        / SHOW-VARIABLE A
        A = 55
        

        也可能是 C 或 C++ 使用定义 until 的宏

        示例(定义):

        #define until(cond) while(!(##cond))
        

        示例(使用):

        int i = 0;
        do  {
            cout << i << "\n";
            i++;
            } until(i == 5);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-02-29
          • 1970-01-01
          • 2017-08-10
          • 1970-01-01
          • 2020-08-26
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多