代码之家  ›  专栏  ›  技术社区  ›  Aidan Quinn

While循环与Repeat循环delphi

  •  -3
  • Aidan Quinn  · 技术社区  · 10 年前

    是否在谷歌上查看两者之间是否存在重大差异 while repeat..until 循环,我没有发现任何有用的东西或我正在寻找的东西。

    我注意到 虽然 循环使我的程序无响应 repeat 虽然 。这有什么具体的原因吗,或者在不同的场景中应该相互使用?

    这是我的代码 虽然 循环:

    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;
    

    这里有一个 重复 循环:

    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;
    

    顺便说一下,我知道上面的代码并没有什么意义,只是一个例子。

    2 回复  |  直到 9 年前
        1
  •  11
  •   No'am Newman    10 年前

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

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

        2
  •  4
  •   J...    10 年前

    这是完全无意义的代码,即使是为了测试。两个示例似乎都忽略了初始化值 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 可能具有非常大或非常小的值。取决于的起始值 k 你的循环要么永远重复,要么根本不运行。由于循环条件根本不同,其中一个或另一个可能更可能属于任一类别。这就是你观察这种行为的原因——这与 虽然 重复 循环,这与在不同条件下测试无意义代码的事实有关。