1

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

例子:

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

这基本上相当于:

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

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

4

5 回答 5

1

Ruby 有直到。

i=0
begin
  puts i
  i += 1
end until i==5
于 2011-07-07T23:36:47.923 回答
1

VBA!

执行直到循环

循环直到

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

于 2011-07-07T23:38:32.103 回答
1

在 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);
于 2021-08-26T18:54:52.127 回答
0

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

 Reponse = InputBox("Please Enter Pwd")
  Do Until Reponse = "Bob-pwr148" ...
于 2013-06-11T10:27:59.720 回答
0

Eiffel 为您提供了一个直到循环。

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是否有问题?

循环不变量

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

不变量是一组一个或多个布尔条件,在每次循环迭代后必须保持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关键字创建了一个循环不变量,该关键字声明了我们的布尔断言。如果 y 不能为 x - 1,循环将立即抛出异常,并让我们准确地知道哪个迭代未能保持断言True

结论

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

于 2020-09-06T15:12:05.617 回答