是否有任何编程语言具有 do-until 循环?
例子:
do
{
<statements>
}
until (<condition>);
这基本上相当于:
do
{
<statements>
}
while (<negated condition>);
注意:我正在寻找测试后循环。
是否有任何编程语言具有 do-until 循环?
例子:
do
{
<statements>
}
until (<condition>);
这基本上相当于:
do
{
<statements>
}
while (<negated condition>);
注意:我正在寻找测试后循环。
Ruby 有直到。
i=0
begin
puts i
i += 1
end until i==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);
在VB中,我们可以找到类似的东西:
Reponse = InputBox("Please Enter Pwd")
Do Until Reponse = "Bob-pwr148" ...
Eiffel 为您提供了一个直到循环。
from
x := 1
until
x > 100
loop
...
end
还有一个“交叉”循环。两者都非常强大和富有表现力。
这个循环的设计可以提供更多。它的语法还有两个部分可以帮助我们解决两个重要的“正确性”问题。
无限循环保护
让我们通过添加一个循环变体来稍微修改我们的循环代码。
from
x := 1
v := 1_000
until
x > 100
variant
v
loop
...
v := v - 1
end
循环变体(本质上)是一个倒计时变量,但不仅仅是任何旧变量。通过使用variant关键字,我们告诉编译器要注意v。具体来说,编译器将生成在两个条件下监视v变量的代码:
v是否随着循环的每次迭代而减小(我们是否在倒计时)。如果它(实际上)不倒计时,那么尝试使用倒计时变量是没有用的,对吧?如果循环变量没有倒计时(减少任何数量),那么我们抛出一个异常。
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。
结论
我们的循环现在非常紧凑和安全——很好地防范了失败(错误、错误)。