Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Loops 有没有任何语言有do-until循环?_Loops_Language Features_Do Loops - Fatal编程技术网

Loops 有没有任何语言有do-until循环?

Loops 有没有任何语言有do-until循环?,loops,language-features,do-loops,Loops,Language Features,Do Loops,是否有任何编程语言具有do-until循环 例如: do { <statements> } until (<condition>); do { } 直至(); 这基本上相当于: do { <statements> } while (<negated condition>); do { } while(); 注意:我正在寻找测试后的循环。Ruby直到 i=0 begin puts i i += 1 end until

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

例如:

do
{
    <statements>
}
until (<condition>);
do
{
}
直至();
这基本上相当于:

do
{
    <statements>
}
while (<negated condition>);
do
{
}
while();
注意:我正在寻找测试后的循环。

Ruby直到

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


虽然我认为这里有很多人会怀疑它是否是一种真正的语言,但好吧,BASIC是微软如何开始的(我知道,对许多人来说,这是一个很弱的论据).

在VB中,我们可以找到如下内容:

 Reponse = InputBox("Please Enter Pwd")
  Do Until Reponse = "Bob-pwr148" ...
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

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

from 
  x := 1 
until 
  x > 100 
loop 
  ... 
end
还有一个“交叉”循环。两者都非常强大和富有表现力

该回路的设计提供了更多功能。它的语法还有两个部分将帮助我们解决两个重要的“正确性”问题

  • 无限循环保护
  • 迭代失败检测
  • 无极回路保护

    让我们通过添加循环变量稍微修改一下循环代码

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

  • v是否随着循环的每次迭代而减少(我们正在倒计时)。如果倒计时变量(事实上)不是倒计时,那么尝试使用倒计时变量是没有好处的,对吗?如果循环变量没有倒计时(减少任何数量),那么我们抛出一个异常

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

  • 这两种方法通过编译器和变量一起工作,以检测迭代循环何时失败或迭代次数过多

    在上面的例子中,我们的代码向我们传达了一个故事,它希望迭代0到1000次,但不会更多。如果是更多,那么我们就停止循环,这让我们不禁要问:我们是否真的有这样的情况——我们迭代了1000次以上,或者我们的条件没有变为真,是不是有什么不对劲

    循环不变量

    现在我们知道了什么是循环变量,我们需要了解什么是循环不变量

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

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

    循环不变量可能类似于:

     Reponse = InputBox("Please Enter Pwd")
      Do Until Reponse = "Bob-pwr148" ...
    
    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关键字创建一个循环不变量。如果y不能成为x-1,循环将立即抛出一个异常,并让我们准确地知道哪个迭代未能保持断言为真

    结论


    现在,我们的循环非常紧密,安全可靠,可以很好地防止失败(bug、错误)。

    但这是一个完全不同的构造,因为无论while/until条件如何,它都不会像while循环那样一次运行。@Jake petroles是的,你是对的。我对它进行了修改,使它在不考虑条件的情况下运行一次。所以Ruby同时具有
    while
    until
    两种形式,很有趣。我想知道为什么更多的语言没有这样做。Pascal有repeat-until,所以这意味着Delphi也有。@Jake-我想更多的语言没有它的原因是可以使用(几乎?)无限数量的不同控制结构。语言设计师需要选择他们想要包含在语言中的内容,以平衡复杂性/大小与方便性。有趣的是,VBA似乎既有do-while,也有do-until。这是一个很好的灵活性。@Jake,是的。VBA有时非常好用:)