while循环与重复循环delphi

时间:2014-03-23 09:32:17

标签: delphi delphi-7

在Google上查看whilerepeat..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我知道上面的代码并没有多大意义,只是一个例子。

2 个答案:

答案 0 :(得分:9)

'repeat'循环保证至少执行一次,因为只有在循环执行一次后才检查终止条件。在执行循环之前检查条件时,'while'循环甚至可能不会执行一次。

除此之外,它们应该花费相同的时间来执行。

答案 1 :(得分:3)

即使是出于测试目的,这也是完全无意义的代码。在赋值语句中使用它之前,这两个示例似乎都忽略了初始化值k。这使得ik的值基本上是随机的。由于循环不会修改循环条件中的值,这意味着随机发生两件事之一;进入循环后,循环条件将被满足或不会。这意味着循环将为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

通过与上述相同的逻辑,ki都可能具有非常大或非常小的值。根据{{​​1}}的起始值,您的循环将永远重复或根本不运行。由于循环条件根本不同,因此一个或另一个可能更有可能属于任何一个类别。这就是您观察此行为的原因 - 它与kwhile循环无关,它与您使用不同条件测试无意义代码的事实有关。