一文帶你掌握C語言的迴圈結構

顧平安發表於2023-12-01

C語言迴圈結構詳解

在C語言中,迴圈結構是一種重要的控制結構,它允許我們重複執行一段程式碼,以達到特定的目的。迴圈結構可以幫助我們簡化重複性的任務,提高程式碼的效率。本篇文章將深入探討C語言中的迴圈結構,包括 while 迴圈、for 迴圈、do-while 迴圈以及迴圈中的控制語句。

1. while 迴圈

1.1 while 迴圈的基本語法

while 迴圈是C語言中最基本的迴圈結構之一。它的基本語法如下:

while (條件) {
    // 迴圈體程式碼
}

在這個語法結構中,條件是一個布林表示式,當條件為真時,迴圈體中的程式碼將被執行。如果條件為假,則跳過迴圈體,繼續執行後續的程式碼。

1.2 while 迴圈的執行流程

  1. 首先,計算條件的值。
  2. 如果條件為真,則執行迴圈體中的程式碼。
  3. 執行完迴圈體後,再次計算條件的值。
  4. 如果條件仍為真,則繼續執行迴圈體,重複步驟3
  5. 如果條件為假,則跳出迴圈,繼續執行後續的程式碼。

1.3 if 和 while的混淆處

在使用 while 迴圈時,有時候容易與if語句混淆。尤其是當條件的判斷較為複雜時,我們需要仔細區分兩者的使用場景。

if 語句用於在特定條件下執行一段程式碼,而 while 迴圈用於重複執行一段程式碼,直到條件不滿足為止。

在使用 while 迴圈時,需要確保迴圈體內部的程式碼能夠改變條件的值,以免陷入無限迴圈的情況。

2. for 迴圈

2.1 for 迴圈的基本語法

for 迴圈是C語言中常用的迴圈結構,它的基本語法如下:

for (初始化表示式; 條件表示式; 更新表示式) {
    // 迴圈體程式碼
}

在這個語法結構中,初始化表示式用於初始化迴圈變數,條件表示式用於判斷迴圈是否繼續執行,更新表示式用於更新迴圈變數的值。

2.2 for 迴圈的執行流程

  1. 首先,執行初始化表示式,初始化迴圈變數。
  2. 然後,計算條件表示式的值。
  3. 如果條件為真,則執行迴圈體中的程式碼。
  4. 執行完迴圈體後,執行更新表示式,更新迴圈變數的值。
  5. 再次計算條件表示式的值。
  6. 如果條件仍為真,則繼續執行迴圈體和更新表示式,重複步驟5
  7. 如果條件為假,則跳出迴圈,繼續執行後續的程式碼。

2.3 for 迴圈的易錯之處

首先,需要確保迴圈變數在迴圈體內部被更新,以免陷入無限迴圈的情況。

其次,迴圈變數的作用範圍僅限於for迴圈內部,如果在迴圈外部使用迴圈變數,可能會導致編譯錯誤。

另外,初始化表示式、條件表示式和更新表示式都可以為空,但分號必須保留

2.4 while 迴圈和 for 迴圈對比

while迴圈 for迴圈
語法 while (條件) {
    // 迴圈體程式碼
}
for (初始化表示式; 條件表示式; 更新表示式) {
    // 迴圈體程式碼
}
使用場景 迴圈次數不確定時 迴圈次數已知或可計算時
迴圈變數 需要在迴圈體內部手動更新 在迴圈結構中自動更新
作用範圍 迴圈外部無法訪問迴圈變數 僅限於for迴圈內部

3 do-while 迴圈

3.1 do-while 迴圈的基本語法

do-while迴圈是C語言中另一種常用的迴圈結構,它的基本語法如下:

do {
    // 迴圈體程式碼
} while (條件);

在這個語法結構中,先執行迴圈體中的程式碼,然後再計算條件的值。如果條件為真,則繼續執行迴圈體,重複以上步驟。如果條件為假,則跳出迴圈,繼續執行後續的程式碼。

3.2 do-while 的執行流程

  1. 首先,執行迴圈體中的程式碼。
  2. 然後,計算條件的值。
  3. 如果條件為真,則繼續執行迴圈體,重複步驟1和2。
  4. 如果條件為假,則跳出迴圈,繼續執行後續的程式碼。

與 while 迴圈和 for 迴圈不同的是,do-while 迴圈保證迴圈體至少執行一次,即使條件一開始就為假。

3.3 3 種迴圈如何選擇?

在選擇使用 while 迴圈、for 迴圈還是 do-while 迴圈時,還是需要根據具體的需求和情況進行判斷,以下我列出一個比較常規的判斷方式,僅供參考。

  • 如果迴圈次數不確定至少要執行一次迴圈體,可以使用 do-while 迴圈。
  • 如果迴圈次數已知或可計算,並且需要在迴圈結構中自動更新迴圈變數,可以使用 for 迴圈。
  • 如果僅需要根據條件判斷是否執行迴圈體,可以使用 while 迴圈。

4 迴圈中跳出

4.1 break 語句

在迴圈結構中,使用 break 語句可以提前跳出迴圈,即使條件仍然滿足。

下面是一個使用 break 語句列印1~4範圍數字的示例:

int i;

for (i = 1; i <= 10; i++) {
    if (i == 5) {
        break;
    }
    printf("%d ", i);
}

// 輸出結果:1 2 3 4

在這個示例中,當迴圈變數i等於5時,執行 break 語句,跳出迴圈。

4.2 continue 語句

在迴圈結構中,使用 continue 語句可以提前結束當前迴圈的迭代,直接進入下一次迭代。

下面是一個使用 continue 語句只列印10以內奇數的示例:

int i;

for (i = 1; i <= 10; i++) {
    if (i % 2 == 0) {
        continue;
    }
    printf("%d ", i);
}

// 輸出結果:1 3 5 7 9

在這個示例中,當迴圈變數 i 為偶數時,執行 continue 語句,跳過當前迭代,直接進入下一次迭代。

使用 break 和 continue 語句可以靈活地控制迴圈的執行流程,以滿足特定的需求。

5 迴圈巢狀

迴圈巢狀是指在一個迴圈結構內部巢狀另一個迴圈結構。透過迴圈巢狀,我們可以實現更復雜的迴圈邏輯。

下面是一個使用迴圈巢狀列印乘法表的示例:

int i, j;

for (i = 1; i <= 9; i++) {
    for (j = 1; j <= i; j++) {
        printf("%d * %d = %d\\t", j, i, i * j);
    }
    printf("\\n");
}

在這個示例中,外層迴圈控制乘法表的行數,內層迴圈控制每行的列數。透過巢狀迴圈,我們可以逐行逐列地列印乘法表的內容。

迴圈巢狀可以實現更復雜的迴圈邏輯,但需要注意迴圈變數的作用範圍和迴圈條件的控制,以避免陷入無限迴圈的情況。

迴圈巢狀如果不做出一定的最佳化,效能上是有很嚴重的問題的哦,特別是多重巢狀的迴圈,學過資料結構與演演算法的朋友應該是明白的。

6 goto 語句

6.1 基本使用

在C語言中,goto 語句可以用於無條件地跳轉到程式中的標記位置。它可以在一定程度上改變程式的執行流程,但過度使用 goto 語句可能會導致程式碼難以理解和維護。

下面是一個使用 goto 語句實現迴圈列印數字1~10的示例:

int i = 1;

loop:
    printf("%d ", i);
    i++;

    if (i <= 10) {
        goto loop;
    }

在這個示例中,使用 goto 語句將程式跳轉到標記位置 loop,實現了迴圈的效果。

6.2 注意事項

  • 應該避免過度使用 goto 語句,以保持程式碼的可讀性和可維護性。
  • 確保跳轉的目標位置在當前作用域內,以避免跨作用域的問題。
  • 注意避免形成死迴圈或無限迴圈,以免程式無法正常結束。

相關文章