zerglurker的C語言教程008——迴圈語句詳解

來源:互聯網
上載者:User

標籤:c++   c語言   編程   語言   

上節課我們提到了程式語句的三大執行順序:順序執行、條件執行和迴圈執行

今天我們詳細講講迴圈執行,不廢話,先上代碼和運行效果

首先來一段範例程式碼,老規矩,建立一個空項目(參考006課)

建立一個空的main.cpp和public.h

public.h裡面定義代碼如下:

void LargeDistributionSequence(unsigned int nLength);

main.cpp代碼如下:

#include <stdio.h>#include "public.h"int main(int nArgc, char* Argv[], char* Env[]){LargeDistributionSequence(15);return 0;}void LargeDistributionSequence(unsigned int nLength){unsigned i;for (i = 0; i < nLength;i++){if (i != 0 && ((i % 10) == 0)){printf("\n");}printf("% 4d ", ((i + 1)*(i + 1)&(~1)) / 2);}printf("\n");}

Ctrl+F5後的效果如下:


for語句的使用格式是這樣的:

for(初始化語句;條件陳述式;每次迴圈的變化條件處理) 需要迴圈的單條語句;

for(初始化語句;條件陳述式;每次迴圈的變化條件處理){

     需要迴圈的多條語句;

}

for迴圈幾個需要注意的地方:

1 初始化語句可以不寫,也可以寫多個

比如

for(;i<nLength;)
或者

for(i=0,j=0;i<nLength;i++,j++)
注意,多條初始化語句寫在一起的時候,必須是能用逗號串連的運算式

運算式而非語句

2  每次迴圈的變化條件處理同樣可以不寫或者寫多個,寫入規則同上面

樣本見1

3 條件陳述式必須要寫,並且在每次迴圈開始就會進行判斷

對於第一次迴圈,初始化語句執行完成後,就會立刻進行條件判斷

如果判斷失敗,則後面的語句不會被執行

4 建議各位哪怕 需要迴圈的語句只有一條,也可以按照多條的方式,使用大括弧括起來

這樣不會因為你對語句進行刪減而導致整個邏輯變化極大

比如:

for(i=0;i<nLength;i++)    printf("ok\n");if(i==nLength)printf("no\n");
如果需求發生變更,不仔細,將第二行語句注釋掉了,那整個邏輯就會變成重複判斷i是否等於nLength,然後什麼也不會輸出

// 注釋一行,從該符號開始,後面的字元全部被注釋,編譯器不會理會

/* 注釋內容 */ 注釋一個塊 從/*後面,到*/前面,這之間所有的內容都會被認為是注釋,編譯器不會理會

我們往往用注釋暫時去掉一些不用功能,或者添加一些代碼說明

除了for可以實現迴圈外,我們還可以用while實現迴圈

在public.h添加代碼後如下:

void LargeDistributionSequence(unsigned int nLength);void LargeDistributionSequenceWhile(unsigned int nLength);void LargeDistributionSequenceDoWhile(unsigned int nLength);
在main.cpp添加代碼如下:

#include <stdio.h>#include "public.h"int main(int nArgc, char* Argv[], char* Env[]){LargeDistributionSequence(15);LargeDistributionSequenceWhile(15);LargeDistributionSequenceDoWhile(15);return 0;}void LargeDistributionSequence(unsigned int nLength){unsigned i;for (i = 0; i < nLength;i++){if (i != 0 && ((i % 10) == 0)){printf("\n");}printf("% 4d ", ((i + 1)*(i + 1)&(~1)) / 2);}printf("\n");}void LargeDistributionSequenceWhile(unsigned int nLength){unsigned i=0;while (i<nLength){if (i != 0 && ((i % 10) == 0)){printf("\n");}printf("% 4d ", ((i + 1)*(i + 1)&(~1)) / 2);i++;}printf("\n");}void LargeDistributionSequenceDoWhile(unsigned int nLength){unsigned i = 0;do{if (i != 0 && ((i % 10) == 0)){printf("\n");}printf("% 4d ", ((i + 1)*(i + 1)&(~1)) / 2);i++;} while (i < nLength);printf("\n");}
運行後結果如下:


可以看到,三個方式結果完全一樣

while的使用方式如下:

while(條件) 單個語句;

while(條件){

多條語句;

}

do 單個語句;while(條件);

do{

多條語句;

}while(條件);

類似for的注意3,while我也同樣建議各位儘可能使用大括弧將代碼括起來

大括弧的另外一個好處是,即使擴內一條語句也沒有,也不會導致迴圈邏輯影響迴圈外的邏輯,這種防範在成百上千行的代碼中,可以挽救你的小命

否則那些莫名其妙的程式錯誤,甚至讓你無從下手,感覺世界崩潰。

for當初設計用來進行條件明確的迴圈,即初始條件明確、迴圈終止條件明確,以及變數明確的迴圈

而while則用來進行模糊迴圈。比如我不知道初始條件或只知道部分初始條件。變數也不明確,它可能會變,也可能下次迴圈才會變,或者因為使用者的特定輸入才會變化

但是實際使用的時候,兩者可以相互替換。

比如初始條件不明朗的時候,for中的初始化語句我可以空出來不寫,唯寫條件陳述式。如果變數變化也不明確,我可以不寫每次迴圈的變化條件處理

同樣,對於while 我可以在while外部將初始化語句寫好,在while內部進行變數變化處理

不過對於while 和do…while還是有一個明確不一樣的地方:

即do…while一定會先執行一次迴圈體,不管條件是否成立。而while當條件不成立的時候,可能一次都不執行

所以上面的測試代碼,將main中的所有15改為0,則輸出就會變成下面的樣子:


第三次的時候,輸出了一個0

printf可以進行格式輸出,比如上面看到的一句:printf("% 4d ", ((i + 1)*(i + 1)&(~1)) / 2);

%表示後面的是格式資訊,空格表示填充符號是空格,4表示對齊長度,d表示輸出的是整數

整個含義是以4字元對齊輸出整數,不足的地方填充空格

這樣輸出的數字就美觀多了

不過數字一旦超過4字元長度,就會原樣輸出,破壞格式

關於輸出格式,後面我還會詳細介紹的

另外,在c語言中,for初始化語句是不能聲明變數的

即變數一定要先聲明,後使用

而在c++中,for初始化語句則可以聲明變數,但不同編譯器的版本處理又不同

vc6中for初始化語句聲明的變數,作用範圍和for一樣大。即for初始化聲明的變數,可以在for同級的代碼中使用

而支援c99以及更高版本的編譯器,則不允許這種情況,for裡面聲明的變數只能在for裡面用,外面則看不到

zerglurker的C語言教程008——迴圈語句詳解

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.