【发布时间】:2011-09-30 21:25:16
【问题描述】:
是否有任何编程语言具有 do-until 循环?
例子:
do
{
<statements>
}
until (<condition>);
基本上相当于:
do
{
<statements>
}
while (<negated condition>);
注意:我正在寻找测试后循环。
【问题讨论】:
标签: loops language-features do-loops
是否有任何编程语言具有 do-until 循环?
例子:
do
{
<statements>
}
until (<condition>);
基本上相当于:
do
{
<statements>
}
while (<negated condition>);
注意:我正在寻找测试后循环。
【问题讨论】:
标签: loops language-features do-loops
Ruby 有直到。
i=0
begin
puts i
i += 1
end until i==5
【讨论】:
while 和 until 两种形式,很有趣。我想知道为什么更多的语言没有这样做。
【讨论】:
在 VB 中我们可以找到类似的东西:
Reponse = InputBox("Please Enter Pwd")
Do Until Reponse = "Bob-pwr148" ...
【讨论】:
埃菲尔为您提供了一个直到循环。
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 ?
循环不变量
既然我们知道了什么是循环变体,我们需要了解什么是循环不变量。
不变量是一组一个或多个布尔条件,在通过循环的每次迭代后必须保持真。我们为什么要这些?
假设您有 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。
结论
我们的循环现在非常紧凑和安全——很好地防范了失败(错误、错误)。
【讨论】:
在 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);
【讨论】: