while和for語句都在循環開始的時候測試它們的布爾表達式。這意味著假如在首次測試時,布爾表達式就求值為false,那麼循環主體一次都不會運行。do語句則不同,它的布爾表達式是在每次重復之後求值的,所以主體至少會執行一次。
do語句的語法如下(不要忘記最後的分號):
do
statement
while (booleanExpression);
如果循環主體由多個語句構成,請使用一個語句塊。下面是在控制台上輸出0~9的那個例子的do語句版本:
int i = 0;
do
{
Console.WriteLine(i);
i++;
}
while (i != 10);
break和continue語句
在前文我們曾用break語句來跳出switch語句。除此之外,還可以使用break語句來跳出一個循環。執行break之後,系統會立即終止循環,並從循環之後的第一個語句繼續執行。在這種情況下,循環的“更新”和“繼續”條件都不會重新判斷。
與此相反,continue語句會造成當前循環結束,並立即開始下一次循環(在對布爾表達式進行重新求值之後)。下面是在控制台上輸出0~9的那個例子的另一個版本,這一次將使用break和continue語句:
int i = 0;
while (true)
{
Console.WriteLine("continue " + i);
i++;
if (i != 10)
continue;
else
break;
}
這段代碼看起來讓人非常難受。許多編程指南都建議小心使用continue,或者根本不要使用它,否則很容易造成難以理解的代碼。continue的行為也令人捉摸不定。例如,假如在一個for語句中執行continue,那麼會在運行了for語句的“更新”部分之後,才開始下一次循環。
在下面的例子中,我們將寫一個do語句來將一個數字轉換成字符串形式。
·使用do語句
1. 在Visual Studio 2005中打開DoStatement項目,它位於My Documents文件夾下的\Microsoft Press\Visual CSharp Step by Step\Chapter 5\DoStatement子文件夾中。
選擇“調試”|“開始執行(不調試)”。
Visual Studio 2005將開始生成並運行Windows應用程序。
應用程序將顯示一個窗體,其中包含兩個文本框和一個Show Steps(顯示步驟)按鈕。在上方的文本框中輸入一個正數(我們使用的算法還不支持負數),然後單擊Show Steps按鈕,下方的文本框就會顯示創建這個數字的字符串形式所需的步驟。
注意 這個簡單的例子展示了如何使用do循環將數字轉換成字符串。但要注意一點,.NET Framework提供了Convert.ToString方法來做同樣的事情。在自己的應用程序中執行類似任務時,應該使用該方法。
2. 作為一個例子,請在上方的文本框中輸入2693,然後單擊Show Steps按鈕。
在下方的文本框中,將顯示創建2693的字符串形式所經歷的步驟,如圖2所示。
圖2 單擊Show Steps按鈕之後將顯示具體步驟
3. 關閉窗口,返回Visual Studio 2005編程環境。
4. 在“代碼和文本編輯器”窗口中顯示Form1.cs的代碼。
找到showSteps_Click方法。該方法會在用戶單擊了Show Steps按鈕之後開始運行。
5. 該方法包含以下語句:
int amount = System.Int32.Parse(number.Text);
steps.Text = "";
string current = "";
do
{
int digitCode = '0' + amount % 10;
char digit = Convert.ToChar(digitCode);
current = digit + current;
steps.Text += current + "\r\n";
amount /= 10;
}
while (amount != 0);
注意 \r代表一個回車符。在多行文本框控件中輸出文本時,需要同時輸出一個回車符和一個換行符,才能跳到下一行,並使光標定位到行首。否則,以後輸出的文本將出現在同一行上。
第一個語句使用System.Int32類的Parse方法,將number文本框的Text屬性中存儲的字符串值轉換成int值:
int amount = System.Int32.Parse(number.Text);
第二個語句清除下方的文本框(稱為steps)中顯示的文本,這一次的做法是將Text屬性設為一個空字符串:
steps.Text = "";
第三個語句聲明一個名為current的字符串變量,並把它初始化為空字符串:
string current = “";
這個方法真正的工作是由do語句來執行的,它從第4個語句開始:
do
{
...
}
while (amount != 0);
我們將利用整數算術操作符和取模操作符,使用10來反復除amount變量,每次獲得的余數都是正在構造的字符串的下一個數位。最終,amount將縮減為0值,循環將結束。注意,循環主體至少會執行一次。假如用戶輸入的就是數字0,這個“至少執行一次”的行為就正是我們所需要的。
do循環中的第1個語句是:
int digitCode = '0' + amount % 10;
該語句聲明一個名為digitCode的int變量,並把它初始化為以下表達式的結果:
'0' + amount % 10
這個表達式需要稍微解釋一下!'0'的值是指字符0的值。在Windows使用的字符集中,該字符等於整數值48(每個字符都有它自己的惟一的字符代碼,這是一個整數值)。類似地,'1'的字符代碼是49,'2'的字符代碼是50,以此類推。
amount % 10的值是用10來除amount之後得到的余數。例如,假如amount包含的值是2693,那麼2693 % 10的結果是3(2693除以10的結果是商269余3)。因此,假如amount等於2693,那麼表達式'0' + amount % 10就等同於'0' + 3,結果是51。這是字符'3'的字符代碼。要注意的是,+操作符在這裡執行了一次隱式強制類型轉換,它將'0'轉換成整數值48,使整個表達式能夠求值。
do循環中的第2個語句是:
char digit = Convert.ToChar(digitCode);
該語句聲明了一個名為digit的char變量,並把它初始化成Convert.ToChar(digitCode)這個方法調用的結果。調用該方法,將返回與參數指定的字符代碼對應的一個字符。換言之,Convert.ToChar('0' + 3)的求值結果就是'3'。
do循環中的第3個語句是:
current = digit + current;
該語句將剛才計算出來的字符變量digit附加到字符串current之前。注意,該語句不能替換為current += digit,否則就會將digit附加到current之後。
do循環中的第4個語句是:
steps.Text += current + "\r\n";
該語句的作用是在Steps文本框的Text屬性中附加另一個要顯示的步驟。
do循環中的最後一個語句是:
amount /= 10;
該語句等同於amount = amount / 10;。如果amount的值是2693,那麼在運行上述語句之後,amount的值將變成269。注意,每一次重復do語句,都會從amount中移除最後一個數位,並將那個數位附加到current字符串之前。
在最後一個練習中,將使用Visual Studio 2005調試器來逐步執行上述do語句,以幫助你理解它的工作過程。
·逐步執行do語句
1. 在“代碼和文本編輯器”窗口中找到showSteps_Click方法。
2. 將鼠標移至showSteps_Click方法的第一個語句。
第一個語句是:
int amount = System.Int32.Parse(number.Text);
3. 右擊第一個語句的任何地方,從彈出菜單中選擇“運行到光標處”。
Visual Studio 2005將生成並運行應用程序。
4. 窗體出現後,在上方的文本框中輸入2693,然後單擊Show Steps按鈕。
程序將暫停運行,Visual Studio 2005將進入調試模式。“代碼和文本編輯器”窗口左側將出現一個黃箭頭,標記出當前語句。
5. 如果“調試”工具欄不可見,請顯示它(選擇“視圖”|“工具欄”|“調試”)。在“調試”工具欄上,請單擊“斷點”按鈕旁邊的下拉列表箭頭。
隨後會打開如圖3所示菜單。
圖3 單擊“斷點”按鈕旁邊的下拉列表箭頭
6. 從這個菜單中選擇“局部變量”。
隨後會打開“局部變量”窗口,其中顯示了當前方法中的局部變量的名稱、值和類型,其中的amount是局部變量。注意,amount的值目前是0,如圖5.4所示。
7. 單擊“調試”工具欄上的“逐語句”按鈕。
調試器將運行當前語句:
int amount = System.Int32.Parse(number.Text);
在“局部變量”窗口中,amount的值將變成2693,黃箭頭會指向下一個語句。
8. 繼續單擊“逐語句”按鈕。
調試器將運行以下語句:
steps.Text = "";
該語句不影響“局部變量”窗口的顯示,因為steps是窗體的一個字段,而不是一個局部變量。黃箭頭繼續指向下一個語句。
圖4 “局部變量”窗口
9. 繼續單擊“逐語句”按鈕。
調試器將運行以下語句:
string current = "";
黃箭頭將指向do循環的起始大括號。
10. 繼續單擊“逐語句”按鈕。
黃箭頭將指向do循環中的第一個語句。do循環包含它自己的兩個局部變量,即digitCode和digit。注意,這些局部變量已經在“局部變量”窗口中顯示,而且digitCode的值為0。
11. 繼續單擊“逐語句”按鈕。
調試器將運行以下語句:
int digitCode = '0' + amount % 10;
在“局部變量”窗口中,digitCode的值將變成51。這是由於表達式amount % 10的結果為3(amount的值為2693),而'3'的字符代碼是51(48 + 3)。
12. 繼續單擊“逐語句”按鈕。
調試器將運行以下語句:
char digit = Convert.ToChar(digitCode);
在“局部變量”窗口中,digit的值將變成'3' 。注意在“局部變量”窗口中,char值是同時使用字符代碼值(本例是51)和對應的字符形式(本例是'3')來顯示的。黃箭頭將指向do循環的下一個語句。
注意,在“局部變量”窗口中,current變量的值是""(即為空)。
13. 繼續單擊“逐語句”按鈕。
調試器將運行以下語句:
current = current + digit;
在“局部變量”窗口中,current變量的值將變成"3"。
14. 繼續單擊“逐語句”按鈕。
調試器將運行以下語句:
steps.Text += current + "\r\n";
該語句將在steps文本框中顯示文本"3",並後跟一個回車符和一個換行符,確保以後的輸出將從文本框的下一行開始。
在“局部變量”窗口中,amount的值仍然為2693。
15. 繼續單擊“逐語句”按鈕。
調試器將運行以下語句:
amount /= 10;
在“局部變量”窗口中,amount的值將變成269。黃箭頭指向do循環的結束大括號。
16. 繼續單擊“逐語句”按鈕。
黃箭頭將指向while語句。
17. 繼續單擊“逐語句”按鈕。
調試器將運行以下語句:
while (amount != 0);
amount的值是269,表達式269 != 0將求值為true,所以將進行下一次循環。黃箭頭將跳回do循環的起始大括號。
18. 繼續單擊“逐語句”按鈕。
黃箭頭將指向do循環中的第一個語句。
19. 再單擊“逐語句”按鈕22次,觀察“局部變量”窗口中的局部變量的值發生的變化。在“局部變量”窗口中,amount的值最終將變成0,而current的值變成"2693"。
黃箭頭將指向do循環的循環繼續條件:
while (amount != 0);
amount的值目前為0,所以表達式amount != 0求值為false,do循環應該終止。
20. 繼續單擊“逐語句”按鈕。
調試器將運行以下語句:
while (amount != 0);
如同我們預期的那樣,dot循環終止,黃箭頭移至showSteps_Click方法的結束大括號。
21. 單擊“調試”工具欄上的“繼續”按鈕。
窗體將出現,並顯示為了創建2693的字符串形式所經歷的4個步驟:"3","93","693"和"2693"。
22. 關閉窗體,返回Visual Studio 2005編程環境。
恭喜!你已經成功編寫了有意義的while和do語句,並利用Visual Studio 2005調試器對它們進行了調試。