C語言探索之旅 | 第一部分第七課:迴圈語句

weixin_33890499發表於2016-10-08
1783214-cf4f11caeadab975.JPG

-- 簡書作者 謝恩銘 轉載請註明出處

第一部分第七課:迴圈語句


上一課C語言探索之旅 | 第一部分第六課:條件表示式結束後,今天我們來學習《迴圈語句》。

下一課我們就來一起編寫第一個C語言的小程式啦,激動不?那就快點把今天這課學完吧!

迴圈是什麼呢?

簡單地說:迴圈使你能夠重複執行同樣的指令

放輕鬆,這一課的內容比較簡單,不像之前的【變數】和【條件表示式】那麼難以消化,所以好好享受這一課,因為第二部分要開始難起來咯!

迴圈是什麼


迴圈是一種結構,使指令可以被執行多次

與 條件語句/條件表示式 類似,迴圈語句也有幾種形式。但是至終,目的仍然是一樣的:多次執行同樣的指令。

我們一起來看看C語言中常用的三種迴圈:

  • while迴圈

  • do...while迴圈

  • for迴圈

這三種迴圈的基本原理都是一樣的,如下圖所示:

1783214-8636a1be72aa4cb9.JPG

上圖中,依次進行的是:

  1. 電腦從上到下執行各條指令,像往常一樣

  2. 執行完最後一條命令,重新回到第一條命令,從上往下開始執行

  3. 如此周而復始

上圖中存在的問題是:如果我們不停止迴圈,那麼電腦是有能力一直執行下去的(我一路向北 離開有你的季節 方向盤周圍 迴轉著我的後悔...)。

是的,我們的電腦兄不像有些人,它是從來不抱怨的,叫它幹什麼就幹什麼,這也是我們喜歡它的原因。

永不停止的迴圈有一個術語叫“死迴圈”,陷入死迴圈的電腦很容易卡機,這也是程式設計師經常抱怨的問題之一。

怎麼能夠讓迴圈停下來呢?

聰明的讀者已經想到了:條件表示式

對了,上一課我們學了條件表示式,現在到它派用場的時候了。

事實上,我們建立迴圈語句的時候,總會給它一個條件,這個條件指明: 在條件為真時,才繼續執行迴圈,否則停止。

下面我們就來看看第一種迴圈: while迴圈

while迴圈


while迴圈的結構是這樣的:

while (/* 條件 */)
{
  // 重複執行的指令
}

不難理解吧,while在英語中是“當...時”,即是說:

當括號裡的“條件”為真時,執行大括號裡的指令,一旦條件變為假,不執行指令,while迴圈結束。

用一個小程式來看一下吧,這個程式中,我們要讓使用者輸入數字27,只有當使用者輸入的是27時,程式才會停止,否則會一直讓使用者輸入數字(我懂的,我懂的,我很任性):

#include <stdio.h>

int main(int agrc, char *argv[]) {
  int number = 0;

  while (number != 27) {
    printf("請輸入 27 ! ");
    scanf("%d", &number);
  }

  return 0;
}

執行程式,會如下顯示:

請輸入 27 ! 10
請輸入 27 ! 17
請輸入 27 ! 30
請輸入 27 ! 27

接下來,我們用while迴圈來做一點更有意思的事情:讓迴圈執行一定次數

int counter = 0;

while (counter< 10) {
  printf("你好 !\n");
  counter++;
}

它會顯示10次“你好!”,如下:

你好!
你好!
你好!
你好!
你好!
你好!
你好!
你好!
你好!
你好!

邏輯到底是怎麼樣的呢?

  1. counter初始值為0

  2. 我們的while迴圈的迴圈條件是 counter < 10,也就是說,只有在counter變數的值小於10的時候,才會執行迴圈體(大括號裡)的指令: 列印“你好!”

  3. 因為初始counter是0,迴圈條件為真,所以執行printf,顯示“你好!”

  4. 在迴圈體中,我們將counter的值加1

  5. 第二次判斷條件的時候,counter的值已經是1了,但還是滿足counter < 10這個條件,因此再次顯示“你好!”

  6. 如此這般,一直到counter的值變為10,不滿足counter < 10這個條件了,while迴圈才結束,所以一共列印了十個“你好!”

為了加深理解,我們再來寫一個小程式,這次我們讓while迴圈每次輸出變數的值:

int counter= 0;

while (counter< 10) {
  printf("變數的值是 %d\n", counter);
  counter++;
}

執行程式,顯示如下:

變數的值是 0
變數的值是 1
變數的值是 2
變數的值是 3
變數的值是 4
變數的值是 5
變數的值是 6
變數的值是 7
變數的值是 8
變數的值是 9

這下是否理解得更透徹了?

do...while迴圈


這種型別和while迴圈非常類似,不過比較少用到。

與while迴圈唯一的不同點就是迴圈條件的位置,while迴圈中迴圈條件是在一開始,而do...while迴圈中是在最後:

int counter = 0;
do {
  printf("你好 !\n");
  counter++;
} while (counter < 10);

這樣的不同改變了什麼呢?

  • 很簡單,while迴圈可能會一次也不執行迴圈體(大括號裡)的指令,假如條件一開始就不滿足。

  • 而do...while迴圈是先執行迴圈體的指令,再做條件判斷,所以do...while的指令至少會被執行一次

如果我們將do...while迴圈中的變數counter初始化為40,那麼do...while會顯示一次“你好!”,對於while迴圈,如果counter初始為40,那麼一次也不會顯示“你好!”

for迴圈


理論上,for迴圈可以實現我們想要的任何型別迴圈。

之前已經說過,for迴圈就是另一種形式而已。

之前while迴圈的例子:

int counter = 0;
while (counter < 10) {
  printf("你好 !\n");
  counter++;
}

以上的程式碼,我們可以寫一個for迴圈的版本,它們做的是同樣的事情:

int counter;

for (counter = 0 ; counter < 10 ; counter++) {
  printf("你好 !\n");
}

這兩個迴圈都會顯示十次“你好!”

for迴圈和while迴圈有什麼區別呢?

  • for迴圈的例子中,counter變數並沒有在宣告的時候初始化

  • 在for後面的括號中,有更多的東西(下面我們會詳述)

  • 在迴圈體(大括號裡的內容)中,沒有counter++這個指令

我們最感興趣的是for後面的括號中的內容,因為那也是for迴圈吸引人的地方

可以看到括號中有三條指令,用分號(;)分隔:

  • 第一條指令用於初始化:在我們的情況,我們將counter的值初始化為0

  • 第二條指令用於規定條件:和while迴圈一樣,這個條件用於判斷迴圈是否繼續執行,當這個條件為真時,for迴圈才會繼續

  • 第三條指令用於做自增:這條指令是在迴圈體中的指令執行完後才執行的,用於更新變數的值;大多數情況下我們是做自增,當然我們也可以做自減(counter--)或者減少任意值(counter-=2) (關於自增和自減,請回去看之前的運算子那一課)

因此,for迴圈的邏輯是這樣的:

  1. 括號裡的第一句指令用於初始化變數,只會執行一次,之後不再執行

  2. 對括號裡的第二句指令做判斷,如果條件為真,則執行迴圈體(大括號裡)的指令,如果為假,則不執行迴圈體,for迴圈結束

  3. 執行完迴圈體裡的指令,接著執行括號裡的第三句指令,用於更新變數的值

  4. 再次對括號裡的第二句指令做判斷,如果條件為真,則執行迴圈體(大括號裡)的指令,如果為假,則不執行迴圈體,for迴圈結束

  5. 如此周而復始,注意,括號裡的第一句指令只會執行一次,之後就用不上了

簡單說來,for迴圈濃縮了很多內容在for後面的括號裡。

一定要熟練掌握for迴圈,因為會很常用

總結


  1. 迴圈能夠使我們的程式重複執行一系列指令。

  2. 有好幾種迴圈:while,do...while,for 。依場景不同,選擇某個迴圈會更適合。

  3. for迴圈可能是使用最頻繁的迴圈語句了,在裡面我們經常會做變數的增減。

第一部分第八課預告


今天的課就到這裡,一起加油咯。

下一次我們學習第八課,來編寫我們的第一個C語言小遊戲吧!

相關文章