標籤: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——迴圈語句詳解