C#快速入門教程(14)—— 迴圈語句結構

曹化宇發表於2018-10-02

在程式碼流程控制中,迴圈的含義就是在特定的條件下多次執行一些程式碼,以簡化某些重複工作的執行,一個典型的例子就是累加的計算,如計算整數1到100的和就可以使用如下程式碼。

static void Main(string[] args)
{
    int sum = 0;
    for( int i=1;i<=100;i++)
    {
        sum = sum + i;
    }
    Console.WriteLine("1到100的和是{0}", sum);
}

程式碼執行結果如下圖。

enter image description here

從這個示例中,我們可以看到迴圈語句結構的幾個要素,如本例中是通過變數i來控制迴圈變數的;其中,i的初始值是1;執行迴圈語句的條件是當i小於或等於100;每次迴圈語句執行後通過i++語句使變數i的資料加1,只有這樣才可以結束迴圈,如果沒有結束迴圈的條件,則會無限迴圈,也稱為死迴圈。

下面,看一下for語句結構的基本語法。

for(<迴圈變數初始化> ; <迴圈條件> ; <迴圈變數每次變化>)
{
    <語句塊>
}

for語句結構的含義是,迴圈控制變數初始化為一定的值,當其滿足一定的條件時就執行<語句塊>的內容,每次執行後需要一個改變迴圈變數資料的操作。

在C#中,迴圈相關的還包括foreach語句結構、while語句結構、do-while語句結構、continue語句和break語句,下面分別討論。

foreach語句結構可以方便的訪問集合(陣列、列表等型別,後續會討論相關內容)中的成員,如下面的程式碼,我們分別使用for語句結構和foreach語句結構訪問一個陣列的成員。

static void Main(string[] args)
{
    int[] arr = new int[10];
    // 給陣列成員賦值
    for( int i=0;i<10;i++)
    {
        arr[i] = i + 1;
    }
    // 顯示陣列成員資料
    foreach(int num in arr)
    {
        Console.WriteLine(num);
    }
}

程式碼執行結果如下圖所示。

enter image description here

再來看一下while和do...while語句結構,其中,while語句結構的應用格式如下。

while(<條件表示式>)
{
    <語句塊>
}

下面是do...while語句結構的應用格式。

do
{
    <語句塊>
}while(<條件表示式>);

我們可以看到,while和do...while語句結構最大的區別就在於<條件表示式>的位置不同;其執行邏輯是,在while語句結構中,每次迴圈前會對條件進行判斷,如果條件滿足,即<條件表示式>的值為true時,執行本次迴圈,當條件不滿足時,即<條件表示式>的值為false時,結構迴圈結構的執行;而do...while語句結構中,條件的判斷會在每次迴圈執行後進行,也就是說,迴圈中的<語句塊>最少會執行一次,當<條件表示式>的值為true時執行下一次迴圈,為false時結構迴圈結構的執行。

下面的程式碼是使用while語句結構計算1到100的累加運算。

static void Main(string[] args)
{
    int sum = 0, n = 1;
    while (n <= 100)
    {
        sum += n;
        n++;
    }
    Console.WriteLine("1到100累加結果為{0}", sum);
}

下面的程式碼是使用do...while語句結構計算1到100的累加運算。

static void Main(string[] args)
{
        int sum = 0, n = 1;
        do
        {
            sum += n;
            n++;
        } while (n <= 100);
        Console.WriteLine("1到100累加結果為{0}", sum);
}

大家可以觀察while和do...while語句結構的工作方式和特點,這裡需要注意的是,do...while語句結構會在每次迴圈結束時才對條件進行判斷,如果第一次執行迴圈時資料不滿足要求,就有可能產生錯誤。

接下來的工作,我們來計算1到100中偶數的和,可以使用兩種方式,首先是通過for語句結構中的迴圈控制變數每次迴圈後加2來處理,如下面的程式碼。

static void Main(string[] args)
{
        int sum = 0;
        for(int i=2;i<=100;i+=2)
        {
            sum += i;
        }
        Console.WriteLine("1到100中偶數的和是{0}", sum);
}

另一種方法是在迴圈語句中使用continue語句來實現,如下面的程式碼。

static void Main(string[] args)
{
    int sum = 0;
    for(int i=2;i<=100;i++)
    {
        if (i % 2 == 1) continue;
        sum += i;
    }
    Console.WriteLine("1到100中偶數的和是{0}", sum);
}

本程式碼中,當i除以2的餘數是1,也就是i不是偶數時,就使用continue語句結束本次迴圈,當i是偶數時,就累加到sum變數中。這裡使用的continue語句的功能就是結束本次迴圈,當條件滿足時執行下次迴圈,當條件不滿足時就結束迴圈結構。

另一個相關的語句是break,其功能是終止迴圈結構的執行;如下面的程式碼,用來一個整數是否為質數。

static void Main(string[] args)
{
        int x=17; // 大於1的整數
        int max = (int)Math.Sqrt(x);
        bool isPrime = true;
        for(int i=2;i<=max;i++)
        {
            if(x % i ==0 )
            {
                isPrime = false;
                break;
            }
        }
        Console.WriteLine("{0}{1}質數", x,
            isPrime?"是":"不是");
}

本例中,首先將isPrime變數設定為true,即假裝x是質數;當x小於4時迴圈不會執行,2和3就是質數;當x大於或等於4並且能被2到x的算術平方根中的任何數整除時,x就不是質數,此時,將isPrime設定為false,並使用break語句退出迴圈結構。

此外,如果是多層迴圈,可以通過goto語句加標籤的方法快速跳出,如下面的程式碼。

static void Main(string[] args)
{
        int counter = 0;
        for (int i = 0; i <= 100; i++)
        {
            for (int j = 0; j <= 100; j++)
            {
                for (int k = 0; k <= 100; k++)
                {
                    counter++;
                    if (i == 10 && j == 20 && k == 30)
                        goto I_FOR_END;

                }
            }
        }
    I_FOR_END:;
        Console.WriteLine("內層迴圈執行{0}次", counter);
}

程式碼中,我們定義了一個標籤I_FOR_END用於標籤i迴圈結束的位置,在三層迴圈中,當滿足特定的條件時就使用goto I_FOR_END;語句直接跳轉到三層迴圈外面。

實際開發中,迴圈語句結構是靈活多變的,大家可以根據實際需要選擇合理的程式碼結構。

如果大家對i++表示式的應用不太熟悉,可以參考我的另一篇文章《這些東西還在爭嗎》

CHY軟體小屋原創作品!

相關文章