- C#實踐教程(第2版)
- 李乃文
- 2882字
- 2021-03-19 18:15:39
3.3 循環(huán)語句
循環(huán)語句用于重復執(zhí)行特定語句塊,直到循環(huán)終止條件成立或遇到跳轉語句。程序中經(jīng)常需要將一些語句重復執(zhí)行,使用基本語句順序執(zhí)行將使開發(fā)人員重復工作,影響效率。
如1+2+3+…+100,使用順序語句需要將100個數(shù)相加;若加至1000、10000或更大的數(shù),使得數(shù)據(jù)量加大,容易出錯,不便管理。
循環(huán)語句簡化了這個過程,將指定語句或語句塊根據(jù)條件重復執(zhí)行。循環(huán)語句分為4種:
□ for for循環(huán)重復執(zhí)行一個語句或語句塊,但在每次重復前驗證循環(huán)條件是否成立。
□ do while do while循環(huán)同樣重復執(zhí)行一個語句或語句塊,但在每次重復結束時驗證循環(huán)條件是否成立。
□ while while語句指定在特定條件下重復執(zhí)行一個語句或語句塊。
□ foreach in foreach in語句為數(shù)組或對象集合中的每個元素重復一個嵌入語句組。
3.3.1 for語句
for循環(huán)在重復執(zhí)行的語句塊之前加入了循環(huán)執(zhí)行條件,循環(huán)條件通常用來限制循環(huán)次數(shù),執(zhí)行流程圖如圖3-13所示。

圖3-13 for循環(huán)流程圖
如圖3-13所示,從開始進入判斷循環(huán)條件是否成立:若成立,執(zhí)行語句塊,并重新判斷循環(huán)條件是否成立;若不成立,結束這個循環(huán)。語法格式如下:
for(<初始化>; <條件表達式>; <增量>) {語句塊}
for語句執(zhí)行括號里面語句的順序如下:
首先是初始化的語句,如int num=0;若for循環(huán)之前已經(jīng)初始化,可以省略初始化表達式,但不能省略分號。
接著是條件表達式,如num<5;表達式?jīng)Q定了該循環(huán)將在何時終止。表達式可以省略,但省略條件表達式,該循環(huán)將成為無限死循環(huán)。
最后是增量,通常是針對循環(huán)中初始化變量的增量,如num++;增量與初始值和表達式共同決定了循環(huán)執(zhí)行的次數(shù)。增量可以省略,但省略的增量將導致循環(huán)無法達到條件表達式的終值,因此需要在循環(huán)的語句塊中修改變量值。
增量表達式后不需要分號,因for語句()內的3個表達式均可以省略,表達式間的分號不能省略,因此有以下空循環(huán)語句:
for (;;) { }
循環(huán)條件中的變量也可用于實際意義,如以下示例。
【練習3-5】
定義整型變量num,計算1+2+3+4+…+1000的數(shù)值并賦值給num,輸出num的值。使用for循環(huán)語句如下:
int num = 0; for (int x = 1; x <= 1000; x++) { num = num + x; } Console.WriteLine(num);
執(zhí)行結果為:500500。練習3-5中將1遞加至1000,相當于求等差數(shù)列的值,省略for循環(huán)中的初始值和增量,可以使用以下語句。
int num = 0; int x = 1; for (; x <= 100; ) { num = num + x; x++; } Console.WriteLine(num);
以上代碼的運行結果與練習3-5是一樣的。除了數(shù)字,條件表達式同樣可用于字符,根據(jù)字符的ASCII值順序進行,如練習3-6所示。
【練習3-6】
定義字符串變量num和字符變量x,將字符從a到z組合在一起賦值給字符串num,并輸出,使用語句如下:
string num=""; char x = 'a'; for (; x <= 'z'; ) { num = num + x; x++; } Console.WriteLine(num);
執(zhí)行結果如下所示:
abcdefghijklmnopqrstuvwxyz
注意
條件表達式必須是布爾值,而且不能是常量表達式,否則循環(huán)將會因無法執(zhí)行或無法結束,而出現(xiàn)漏洞或失去意義。
3.3.2 do while語句
do while循環(huán)在重復執(zhí)行的語句塊之后加入了循環(huán)執(zhí)行條件,與for循環(huán)執(zhí)行順序相反。除了條件判斷順序的不同,do while語句雖然同樣使用小括號“()”來放置條件表達式,但小括號里面只能有一條語句,不需要分號結尾。執(zhí)行流程圖如圖3-14所示。

圖3-14 do while流程圖
如圖3-14所示,程序在開始時首先執(zhí)行循環(huán)中的語句塊,在語句塊執(zhí)行結束再進行循環(huán)條件的判斷。條件成立,重新執(zhí)行語句塊;條件不成立,結束循環(huán)。語法結構如下:
do {語句塊} while(條件表達式);
與for循環(huán)不一樣的有:
□ do關鍵字與while關鍵字分別放在循環(huán)的開始和結束。
□ 條件表達式放在循環(huán)最后。
□ while關鍵字后的括號()內,表達式只有一個。
□ 表達式的括號后需要加分號。
與for循環(huán)相比,do while循環(huán)將初始化放在了循環(huán)之前,將條件變量的變化放在了循環(huán)語句塊內。同樣是1到1000遞加,使用do while語句過程如下。
【練習3-7】
定義整型變量num,計算1+2+3+4+…+1000的數(shù)值并賦值給num,輸出num的值。使用do while語句如下:
int num = 0; int x=1; do { num = num + x; x = x + 1; } while (x <=1000); Console.WriteLine(num);
執(zhí)行結果與練習3-5相同。for主要控制循環(huán)的次數(shù),而對于不確定次數(shù)的循環(huán),使用do while比較合適,如練習3-8所示。
【練習3-8】
定義整型變量num,計算143除了1以外的最小約數(shù),并賦值給num,輸出num。求約數(shù)即相除余數(shù)為0的整數(shù),只能從最小的數(shù)依次計算,則語句如下:
int num=2; do { num=num+1; } while(143%num!=0); Console.WriteLine(num);
程序開始,余數(shù)都不為0,直到余數(shù)為0,循環(huán)條件不成立,就找到了143的最小約數(shù)。若使用for循環(huán),語句如下:
int num = 2; for (; 143%num!=0; ) { num++; } Console.WriteLine(num);
執(zhí)行結果為:11。
3.3.3 while語句
while語句在條件表達式判定之后執(zhí)行循環(huán),與for循環(huán)的執(zhí)行順序一樣。不同的是語句格式和適用范圍。
while的使用比較靈活,甚至在某些情況下能替代條件語句和跳轉語句。while循環(huán)流程圖如圖3-15所示。

圖3-15 while語句流程圖
如圖3-15所示,在執(zhí)行至while語句時首先判斷循環(huán)條件是否成立:若成立,執(zhí)行語句塊,并重新判斷循環(huán)條件是否成立;若不成立,結束這個循環(huán)。語法格式如下:
while(條件表達式) {語句塊}
從while使用格式看出,while的使用與for很接近,滿足條件表達式即進行while語句塊,否則結束循環(huán)。
while后的括號()只能使用一個條件表達式語句,若在循環(huán)中不改變條件表達式中的變量值,循環(huán)將無限進行下去,因此循環(huán)語句塊中包含改變變量值的語句。如使用while計算1到1000這1000個數(shù)字的和,如練習3-9所示。
【練習3-9】
定義整型變量num,計算1+2+3+4+…+1000的數(shù)值并賦值給num,輸出num的值。使用while循環(huán)語句如下:
int i=0,num=0; while(i<=1000) { num = num + i; i++; } Console.WriteLine(num);
運行上述代碼,其結果與練習3-5結果一樣。代碼中,i變量在循環(huán)中改變了數(shù)值,否則循環(huán)將永遠進行下去,Console.WriteLine(num);語句將無法被執(zhí)行。
3.3.4 foreach in語句
foreach in語句主要用于數(shù)組、集合等元素成員的訪問。單個變量的賦值是最為簡單的,之前介紹過。但C#中有數(shù)組、集合之類數(shù)據(jù)類型,這些數(shù)據(jù)類型變量中,不止包含一個數(shù)據(jù),而是一系列數(shù)據(jù)。對這些數(shù)據(jù)類型的訪問,可以使用foreach in語句。
使用foreach in語句,可以在不確定元素成員個數(shù)的前提下,對元素成員執(zhí)行遍歷,如數(shù)組(在本書第2章有簡單介紹)類型的元素。
數(shù)組成員的訪問需要指定成員的索引,而若要遍歷數(shù)組中所有成員,則需要知道數(shù)組成員的個數(shù)(也叫作數(shù)組長度),但使用foreach in語句可以在沒有獲取數(shù)組長度的情況下對元素成員進行遍歷。
數(shù)組中的數(shù)可多可少,若一個個賦值會加大開發(fā)人員工作量,使用foreach in語句可以對數(shù)組及對象集合成員進行操作,如賦值、讀取等。
數(shù)組中的成員數(shù)量各不相同,foreach in循環(huán)不需要指定循環(huán)次數(shù)或條件。如針對有N個成員的數(shù)組,foreach in循環(huán)流程圖如圖3-16所示。
圖3-16是foreach in循環(huán)作用的形象圖,并非標準流程圖。foreach語句為數(shù)組或對象集合中的每個元素重復一個嵌入語句組,循環(huán)訪問集合以獲取所需信息。

圖3-16 foreach in循環(huán)流程圖
嵌入語句為數(shù)組或集合中的每個元素順序執(zhí)行。當為集合中的所有元素完成操作后,控制傳遞給foreach語句塊之后的下一個語句。語法格式如下:
foreach (變量聲明 in 數(shù)組名或集合類名) { 語句塊 // 使用聲明的變量替代數(shù)組和集合類成員完成操作 }
foreach語句聲明的變量替代了數(shù)組成員,由于格式過于模糊、不易理解,通過練習來講解foreach語句的使用,如練習3-10所示。
【練習3-10】
定義整型數(shù)組num并賦值,定義整型變量替代num成員,輸出數(shù)組成員,使用語句如下。
int[] num = new int[] { 0, 1, 2, 3, 5, 8, 13 }; foreach (int i in num) { Console.Write(i); Console.Write(" "); }
執(zhí)行結果為:
0 1 2 3 5 8 13
代碼中的Console.Write();表示輸出()中的字符串,不進行換行。Console.Write(" ");語句輸出一個空格。
在foreach語句塊內的任意位置都可以使用跳轉語句跳出當前循環(huán)或整個foreach語句塊。跳轉語句在本章3.5節(jié)介紹。
注意
foreach循環(huán)不能應用于更改集合內容,以避免產生不可預知的副作用。
- 現(xiàn)代C++編程:從入門到實踐
- Learning Docker
- 小創(chuàng)客玩轉圖形化編程
- Three.js開發(fā)指南:基于WebGL和HTML5在網(wǎng)頁上渲染3D圖形和動畫(原書第3版)
- UML+OOPC嵌入式C語言開發(fā)精講
- 游戲程序設計教程
- Effective Python Penetration Testing
- Instant Nancy Web Development
- C#程序設計教程(第3版)
- Getting Started with React Native
- Illustrator CS6設計與應用任務教程
- 零代碼實戰(zhàn):企業(yè)級應用搭建與案例詳解
- App Inventor 2 Essentials
- Python商務數(shù)據(jù)分析(微課版)
- Drupal 8 Development:Beginner's Guide(Second Edition)