在Google上查看while
和repeat..until
循环之间是否存在重大差异,我找不到任何有用或我正在寻找的东西。
我注意到while
循环使我的程序无响应,而repeat
的效果优于while
。是否有任何具体原因,或者是否应该在不同情况下相互使用?
这是我在while
循环中的代码:
var
m,val : Integer;
i,k : Real;
begin
val := StrToInt(edtShot.Text);
i := sqr(k);
k := sqrt(i+val);
m := 0;
while i <= 0 and k <= 10 do
begin
inc(m);
end;
end;
这里是一个repeat
循环:
var
m,val : Integer;
i,k : Real;
begin
val := StrToInt(edtShot.Text);
i := sqr(k);
k := sqrt(i+val);
m := 0;
repeat
inc(m);
until i > 0 and k > 10;
end;
BTW我知道上面的代码并没有多大意义,只是一个例子。
答案 0 :(得分:9)
'repeat'循环保证至少执行一次,因为只有在循环执行一次后才检查终止条件。在执行循环之前检查条件时,'while'循环甚至可能不会执行一次。
除此之外,它们应该花费相同的时间来执行。
答案 1 :(得分:3)
即使是出于测试目的,这也是完全无意义的代码。在赋值语句中使用它之前,这两个示例似乎都忽略了初始化值k
。这使得i
和k
的值基本上是随机的。由于循环不会修改循环条件中的值,这意味着随机发生两件事之一;进入循环后,循环条件将被满足或不会。这意味着循环将为repeat
运行一次(或者根本不运行while
)或循环永远不会终止,您的应用程序将挂起。考虑一下案例:
var
m,val : Integer;
i,k : Real;
begin
val := StrToInt(edtShot.Text); // I don't know what this value is
i := sqr(k); // k is random, uninitialized - could be anything
k := sqrt(i+val); // maybe 3.23452E-14...maybe 1.9234e12
m := 0; // Since i is a square, it WILL be positive!
// same for k
while (i <= 0) and (k <= 10) do //need to enclose these to compile!
begin // i will never be <= 0 unless k was
inc(m); // 0 to start - extremely unlikely
end;
end;
重要的一点是,当输入此方法时,k
(实际上,所有局部变量)在其内存位置都有任何随机垃圾值。如果在使用之前没有为其赋值,则使用随机的,可能非常大或极小的值。这使您的程序无法预测。 编译器也应该警告你!不要忽略编译器警告。
现在考虑一下:
repeat
inc(m);
until (i > 0) and (k > 10); //need to enclose these to compile!
// i almost certain to be >0, likewise k very
// likely to be > 10
通过与上述相同的逻辑,k
和i
都可能具有非常大或非常小的值。根据{{1}}的起始值,您的循环将永远重复或根本不运行。由于循环条件根本不同,因此一个或另一个可能更有可能属于任何一个类别。这就是您观察此行为的原因 - 它与k
或while
循环无关,它与您使用不同条件测试无意义代码的事实有关。