do 循环

  do 循环 以下述方式执行:执行标记为循环的代码,然后进行一个布尔测试,如果测试结果为 true,就再次执行这段代码,并重复这个过程。当测试结果为 false 时,就退出循环。

do 循环的结构如下:

  1. do
  2. {
  3. <code to be looped>
  4. } while (<Test>);

其中计算 <Test> 会得到一个布尔值。

⚠️ while 语句之后必须使用分号。
例如,使用该结构可以把从 1~10 的数字输出到一列上:

  1. int i = 1;
    do
    {
    Console.WriteLine("{0}", i++);
    } while (i <= 10);


  在把 i 的值写到屏幕上后,使用后缀形式的 ++ 运算符递增 i 的值,所以需要检查一下 i <= 10,把 10 也包含在输出到控制台的数字中。

  下面的示例使用这个结构略微修改一下本节引言中的代码。该段代码计算了一个账户在 10 年后的余额。这次使用一个循环,根据起始的金额和固定利率,计算该账户的金额要花多长时间才能达到某个指定的数值。

  把下述代码添加到 Program.cs 中:

  1. static void Main(string[] args)
  2. {
  3. double balance, interestRate, targetBalance;
  4. Console.WriteLine("What is your current balance ");
  5. balance = Convert.ToDouble(Console.ReadLine());
  6. Console.WriteLine("What is your current annual interest rate(in %) ");
  7. interestRate = 1 + Convert.ToDouble(Console.ReadLine()) / 100.0;
  8. Console.WriteLine("What balance woule you like to have ");
  9. targetBalance = Convert.ToDouble(Console.ReadLine());
  10. int totalYears = 0;
  11. do
  12. {
  13. balance *= interestRate;
  14. ++totalYears;
  15. } while (balance < targetBanlance);
  16. Console.WriteLine("In {0} year{1} you'll have a balance of {2}.",
  17. totalYears, totalYears == 1 "" : "s",
  18. balance);
  19. Console.ReadKey();
  20. }
示例的说明  这段代码利用固定的利率,对年度计算余额的过程重复必要的次数,直到满足条件为止。在每次循环中,递增一个计数器变量,就可以确定需要多少年:

  1. int totalYears = 0;
    do
    {
    balance *= interestRate;
    ++totalYears;
    } while (balance < targetBalance);


然后就可以将这个计数器变量用作输出结果的一部分:

  1. Console.WriteLine("In {0} year{1} you'll have a balance of {2}.",
    totalYears, totalYears == 1 "" : "s",
    balance);


-   这可能是 :(三元) 运算符最常见的用法了 —用最少的代码有条件地格式化文本。这里,如果 totalYears 不等于 1,就在 year 后面输出一个 s。

  do 循环至少执行一次。有时(如这个示例)这并不是很理想。当然,可以添加一个 if 语句。

  1. int totalYears = 0;
  2. if (balance < targetBalance)
  3. {
  4. do
  5. {
  6. balance *= interestRate;
  7. ++totalYears;
  8. } while (balance < targetBalance);
  9. }
  10. Console.WriteLine("In {0} year{1} you'll have a balance of {2}.",
  11. totalYears, totalYears == 1 "" : "s",
  12. balance);

  这显然无谓地增加了复杂性。更好的解决方案是使用 while 循环