do 循环

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

do 循环的结构如下:

        do
        {
            <code to be looped>
        } while (<Test>);

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

⚠️ while 语句之后必须使用分号。


例如,使用该结构可以把从 1~10 的数字输出到一列上:

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

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


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

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

        static void Main(string[] args)
        {
            double balance, interestRate, targetBalance;
            Console.WriteLine("What is your current balance?");
            balance = Convert.ToDouble(Console.ReadLine());
            Console.WriteLine("What is your current annual interest rate(in %)?");
            interestRate = 1 + Convert.ToDouble(Console.ReadLine()) / 100.0;
            Console.WriteLine("What balance woule you like to have?");
            targetBalance = Convert.ToDouble(Console.ReadLine());
            int totalYears = 0;
            do
            {
                balance *= interestRate;
                ++totalYears;
            } while (balance < targetBanlance);
            Console.WriteLine("In {0} year{1} you'll have a balance of {2}.",
                                totalYears, totalYears == 1 ? "" : "s", 
                                balance);
            Console.ReadKey();
        }

示例的说明

  这段代码利用固定的利率,对年度计算余额的过程重复必要的次数,直到满足条件为止。在每次循环中,递增一个计数器变量,就可以确定需要多少年:

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

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

        Console.WriteLine("In {0} year{1} you'll have a balance of {2}.",
                            totalYears, totalYears == 1 ? "" : "s", 
                            balance);
  •   这可能是 ? :(三元) 运算符最常见的用法了 --用最少的代码有条件地格式化文本。这里,如果 totalYears 不等于 1,就在 year 后面输出一个 s。

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

        int totalYears = 0;
        if (balance < targetBalance)
        {
            do
            {
                balance *= interestRate;
                ++totalYears;
            } while (balance < targetBalance);
        }
        Console.WriteLine("In {0} year{1} you'll have a balance of {2}.",
                            totalYears, totalYears == 1 ? "" : "s",
                            balance);

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

🔚