


版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第 5 章 使用復(fù)合賦值和循環(huán)語(yǔ)句本章旨在教會(huì)你:使用復(fù)合賦值操作符更新變量值使用 while 、 for 和 do 循環(huán)語(yǔ)句單步執(zhí)行 do 語(yǔ)句,觀察變量值的變化第 4 章講述了如何使用 if 和 switch 語(yǔ)句選擇性地運(yùn)行語(yǔ)句。本章要介紹如何使用各種 循環(huán)語(yǔ)句重復(fù)運(yùn)行一個(gè)或多個(gè)語(yǔ)句。寫(xiě)循環(huán)語(yǔ)句時(shí)通常要控制重復(fù)次數(shù)。為此可以使用一 個(gè)變量,每次重復(fù)都更新它的值,并在變量抵達(dá)特定值時(shí)停止重復(fù)。因此,還要介紹如何 在這些情況下使用特殊的賦值操作符來(lái)更新變量值。5.1 使用復(fù)合賦值操作符前面講過(guò)如何使用算術(shù)操作符創(chuàng)建新值。 例如以下語(yǔ)句使用操作符 + 創(chuàng)建比變量 answer 大 42 的值,
2、新值在控制臺(tái)顯示:Console.WriteLine(answer + 42);前文還講過(guò)如何使用賦值語(yǔ)句更改變量值。以下語(yǔ)句使用賦值操作符= 將 answer 的值變成 42:answer = 42;要在變量的值上加42,可在同一個(gè)語(yǔ)句中使用賦值和加法操作。例如,以下語(yǔ)句在answer上加42,新值再賦給answer。換言之,在運(yùn)行該語(yǔ)句之后,answer的值比之前大42:answer = answer + 42;雖然這是有效的語(yǔ)句, 但有經(jīng)驗(yàn)的程序員不會(huì)這樣寫(xiě)。 在變量上加一個(gè)值是常見(jiàn)操作, 所以C#專門(mén)提供了 +=操作符來(lái)簡(jiǎn)化它。要在 answer上加42,有經(jīng)驗(yàn)的程序員會(huì)像下面這 樣寫(xiě)
3、:answer += 42;類似, 可將任何算術(shù)操作符與賦值操作符合并見(jiàn)下表。 這些操作符稱為 復(fù)合賦值操作符不要這樣寫(xiě)要這樣寫(xiě)variable = variable * number;variable *= number;variable = variable / number;variable /= number;variable = variable % number;variable %= number;variable = variable + number;variable += number;variable = variable - number;variable -= num
4、ber;提示復(fù)合賦值操作符和簡(jiǎn)單賦值操作符具有一樣的優(yōu)先級(jí)和右結(jié)合性。操作符+=可用于字符串;作用是將一個(gè)字符串附加到另一個(gè)字符串末尾。例如,以下 代碼在控制臺(tái)上顯示 "Hello John":string name = "John"string greeting = "Hello "greeting += name;Console.WriteLine(greeting);但其他任何復(fù)合賦值操作符都不能用于字符串。|匯注意變量遞增或遞減1不要使用復(fù)合賦值操作符,而是使用操作符+和-。例如,不要像下面這樣寫(xiě):count += 1;而是像
5、下面這樣寫(xiě):count+;5.2 使用while語(yǔ)句使用while語(yǔ)句,可在條件為true的前提下重復(fù)運(yùn)行一個(gè)語(yǔ)句。while語(yǔ)句的語(yǔ)法如下:while (booleanExpressio)nstatement先求值booleanExpression(布爾表達(dá)式,注意必須放在圓括號(hào)中),如果為true,就運(yùn)行語(yǔ)句(statement)。再次求值booleanExpression,仍為 true就再次運(yùn)行語(yǔ)句。再次求值booleanExpression這個(gè)過(guò)程一直繼續(xù),直至結(jié)果為false,此時(shí)while語(yǔ)句退出,從while構(gòu)造之后的第一個(gè)語(yǔ)句繼續(xù)。while語(yǔ)句在語(yǔ)法上與if語(yǔ)句有許多相似的
6、地方(事實(shí)上,除了關(guān)鍵字不同,語(yǔ)法完全相同),具體如下。表達(dá)式必須是布爾表達(dá)式。布爾表達(dá)式必須放在圓括號(hào)中。首次求值布爾表達(dá)式為false,語(yǔ)句不運(yùn)行。要在while的控制下執(zhí)行兩個(gè)或更多語(yǔ)句,必須用大括號(hào)將語(yǔ)句分組成代碼塊。以下while語(yǔ)句向控制臺(tái)寫(xiě)入值 09。一旦變量i的值變成10, while語(yǔ)句中止,不再 運(yùn)行代碼塊。int i = 0;while (i < 10)Console.WriteLine(i);i+;所有while語(yǔ)句都應(yīng)在某個(gè)時(shí)候終止。新手常見(jiàn)錯(cuò)誤是忘記添加語(yǔ)句最終造成布爾表達(dá)式求值為false來(lái)終止循環(huán)。在上例中,這個(gè)語(yǔ)句就是i+;。|匯注意while循環(huán)的變量
7、i控制循環(huán)次數(shù)。這是常見(jiàn)的設(shè)計(jì)模式,具有這個(gè)作用的變量有時(shí)也稱為哨兵變量。還可創(chuàng)建嵌套循環(huán),這種情況下一般延續(xù)該命名模式來(lái)使用 j, k甚至I等作為哨兵變量名。提示 和if語(yǔ)句一樣,建議總是為while語(yǔ)句使用代碼塊,即使其中只有一個(gè)語(yǔ)句。這樣以后添加代碼更省心。如果不這樣做,只有while后的第一個(gè)語(yǔ)句才會(huì)與之關(guān)聯(lián),造成難以發(fā)現(xiàn)的bug。例如以下代碼:int i = 0;while (i < 10)Console.WriteLine(i);i+;代碼將無(wú)限循環(huán),無(wú)限顯示零,因?yàn)橹挥蠧onsole.WriteLine語(yǔ)句才和while關(guān)聯(lián), i+;語(yǔ)句雖然縮進(jìn)但編譯器不把它視為循環(huán)主體的
8、一部分。以下練習(xí)寫(xiě)一個(gè) while循環(huán),每次從源文件讀取一行內(nèi)容,將其寫(xiě)入文本框。編寫(xiě)while語(yǔ)句1. 在 Visual Studio 2013中打開(kāi) WhileStatement項(xiàng)目,它位于“文檔”文件夾下的 'Microsoft Press'Visual CSharp Step by Step'Chapter 5Windows X'WhileStatement 子 文件夾中。2. 在“調(diào)試”菜單中選擇“啟動(dòng)調(diào)試”。Visual Studio 2013生成并運(yùn)行應(yīng)用程序。應(yīng)用程序本身是一個(gè)簡(jiǎn)單的文本文件查 看器,用于打開(kāi)文件并查看內(nèi)容。3. 單擊 Open
9、File 。如果使用 Windows 8.1,將打開(kāi)文件選取器并顯示“文檔”文件夾的內(nèi)容(如果使用 Windows 8.1 Updatre1 以后的版本,則顯示 OneDrive 的“文檔”文件夾中的內(nèi) 容 ),如下圖所示 (在你的計(jì)算機(jī)上,文件和文件夾列表可能有所不同)。這臺(tái)電腦- 文檔返回上TE 抵毎禰樣序7IDSffapnu. -J-吐 ”IV >*sFJ I WtbWiiVBffiMSWy Wifa-SriM20切* 12.-A7務(wù)2FH如果使用 Windows 7 ,將顯示"打開(kāi)”對(duì)話框,如下圖所示。費(fèi)呦3風(fēng)a排列方式:立骨實(shí)-*下薦4J1S: 6亍曲 口血=st:呼
10、Eft日?*am/LVG 12:341db SkyOrive蟲(chóng) id Software2O1W2S 10t32g My Box AeJnflmgTalion arvice Script: CDinpDnrnt2&11/2/20 11:15,inUBgrjfcjn Services Script T«Jk剜如耐11:1$、4岸出 iTools201277/7MlcroEoft Codenara Kcwlyn CTP - October 20112Q1V10/71 L12B*欺悴Pr&ss2QW272 6>42g. My Ekn2013郵 n:aa時(shí) CiurwEK
11、片Mv Diah-dl Editions2011/5/22 20:53目se<”i n|立陣3的;打幵阿無(wú)論什么操作系統(tǒng),都可利用該功能切換至一個(gè)文件夾并選擇要顯示的文件。4. 切換到這臺(tái)電腦"文檔”文件夾下的Microsoft Press'Visual CSharp Step byStep'Chapter 5Windows X'WhileStatement'WhileStatement 子文件夾。5. 選擇文件,單擊"打開(kāi)”按鈕。文件名在小文本框顯示,但文件內(nèi)容沒(méi)有在大文本框中顯示。 這是由于尚未實(shí)現(xiàn)代碼來(lái)讀取并顯示源文件內(nèi)容。下面的
12、步驟將添加這個(gè)功能。6. 返回Visual Studio 2013并停止調(diào)試。7. 在 “ 代 碼 和 文 本 編 輯 器 ” 窗 口 中 打 開(kāi) 文 件 , 找 到 openFileClick 方法。在“打開(kāi)”對(duì)話框中選擇文件并單擊“打開(kāi)”按鈕后將調(diào)用 該方法。應(yīng)用程序的不同版本以不同方式實(shí)現(xiàn)該方法。目前不需要理解方法的細(xì) 節(jié),只需知道方法提示用戶指定文件(通過(guò) FileOpenPicker 或 OpenFileDialog 窗口 )并打開(kāi)指定文件以進(jìn)行讀取。 (在 Windows 7 版本中,方法只是顯示 OpenFileDialog 窗口。 當(dāng)用戶選擇文件并單擊“打開(kāi)”按鈕后, 將調(diào)用
13、openFileDialogFileOk 方法 來(lái)打開(kāi)文件以進(jìn)行讀取。 )openFileClick 方法 (Windows 8.1) 或 openFileDialogFileOk 方法 (Windows 7 或 Windows 8) 的最后兩個(gè)語(yǔ)句很重要。 Windows 8.1 版本如下:TextReader reader = new StreamReader(inputStream.AsStreamForRead(); displayData(reader);第一個(gè)語(yǔ)句聲明 TextReader 變量 reader。TextReader 是.NET Framework 提供的類, 用于從
14、文件等來(lái)源讀取字符流。它在 System.IO 命名空間中。該語(yǔ)句使用戶指定 文件中的數(shù)據(jù)可供 TextReader對(duì)象使用,然后利用該對(duì)象從文件讀取數(shù)據(jù)。最后 一個(gè)語(yǔ)句調(diào)用displayData方法,將reader作為參數(shù)傳遞。方法使用reader對(duì)象讀取數(shù)據(jù)并在屏幕上顯示,稍后將實(shí)現(xiàn)該方法。Windows 7 版本對(duì)應(yīng)的語(yǔ)句如下:TextReader reader = src.OpenText();displayData(reader);src 變量是 FileInfo 對(duì)象,填充了用戶所選文件的信息。FileInfo 類也是 .NETFramework 提供的類,它的 OpenText
15、方法用于打開(kāi)文件以進(jìn)行讀取。第一個(gè)語(yǔ)句 打開(kāi)所選文件,使reader變量能接收文件內(nèi)容。和Windows 8.1版本一樣,最后一個(gè)語(yǔ)句調(diào)用displayData方法并將reader作為參數(shù)傳遞。8. 找到 displayData 方法。它的兩個(gè)版本是相同的:private void displayData(TextReader reader)/ TODO: add while loop here主體只有一行代碼,馬上就要添加代碼來(lái)獲取并顯示數(shù)據(jù)。9. 將 TODO 注釋替換成以下語(yǔ)句:source.Text = ""source變量是窗體上最大的那個(gè)文本框。把它的Text屬
16、性設(shè)為空字符串(""),就可以清除當(dāng)前顯示的任何文本。10. 在剛才輸入的語(yǔ)句之后,輸入以下語(yǔ)句:string line = reader.ReadLine();上述語(yǔ)句聲明string變量line ,調(diào)用reader.ReadLine方法把文件中的第一行文本讀 入變量。方法要么返回讀取的一行文本;要么返回特殊值null來(lái)表明沒(méi)有更多的行可供讀取。如果一行文本都沒(méi)有返回,表明是空文件。11. 在剛才輸入的代碼之后繼續(xù)輸入以下代碼:while (line != null)source.Text += line + 'n:line = reader.ReadLine()
17、;以上while循環(huán)依次讀取文件每一行,直至沒(méi)有更多行。while循環(huán)判斷l(xiāng)ine變量值。不為null就顯示讀取的行,具體做法是將該行附加到source文本框的Text屬性,并在行末添加換行符('n')oTextReader對(duì)象的ReadLine 方法讀取每一行會(huì)自動(dòng)刪除換行符,所以要重新添加。然后,在下次循環(huán)之前,while循環(huán)讀取下一行文本。如果沒(méi)有更多文本,ReadLine返回null值,造成while循環(huán)終止。12. 如果使用 Windows 8.1,在while循環(huán)的結(jié)束大括號(hào) 之后添加以下語(yǔ)句:reader.Dispose();如果使用 Windows 7或 Win
18、dows 8,在之后添加以下語(yǔ)句:reader.Close();這將釋放與文件關(guān)聯(lián)的資源并關(guān)閉文件。這是一個(gè)好習(xí)慣。除了釋放訪問(wèn)文件所 需的內(nèi)存和其他資源,還使其他應(yīng)用程序能使用該文件。13. 在"調(diào)試”菜單中選擇"啟動(dòng)調(diào)試”。14. 窗體出現(xiàn)之后單擊Open File。15. 在文件選取器或“打開(kāi)”對(duì)話框中,切換到“文檔”文件夾下的MicrosoftPressWisualCSharp Step by StepChapter 5Win dowsXWhileStatementWhileStatement 子文件夾,選擇 文件,單擊 “打開(kāi)”按鈕。卩二注意 不要打開(kāi)非文本文件。
19、例如,打開(kāi)可執(zhí)行程序或圖形文件會(huì)顯示二進(jìn)制信息的文本形式。如果文件很大,應(yīng)用程序可能掛起,需要強(qiáng)制終止。OlSCiMOpen FileiI eStatement ComplelteWhileStatennentMai nWi ndawxam l.csprivate void displayDatafTetReader reader) (source.Text =乩ring line a while (lin != null)urce.Text += lire * 飛rf;line = reader Reiad Li r*e);Ireader. Di16. 在文本框中滾動(dòng)文本,找到display
20、Data方法。驗(yàn)證方法包含剛才添加的代碼。17. 返回Visual Studio 2013并停止調(diào)試。5.3 編寫(xiě)for語(yǔ)句C#的大多數(shù)while循環(huán)語(yǔ)句都具有以下常規(guī)結(jié)構(gòu):initializationwhile ( Boolean expressionstatementupdate control variablefor語(yǔ)句提供了這種結(jié)構(gòu)的更正式版本,它將initialization (初始化)、Boolean expression(布爾表達(dá)式)與update control variable (更新控制變量)合并到一起。用過(guò) for語(yǔ)句 之后就能體會(huì)到它的好處,它能防止遺漏初始化和更新控制
21、變量的代碼,減少寫(xiě)出無(wú)限循 環(huán)代碼的概率。以下是for語(yǔ)句的語(yǔ)法:for ( initialization; Boolean expression; update control variable statement其中,statement(語(yǔ)句)是for循環(huán)主體,要么是一個(gè)語(yǔ)句,要么是用花括號(hào)封閉的代碼塊。前面展示過(guò) while循環(huán)的一個(gè)例子,它顯示09的整數(shù)。下面要用for循環(huán)改寫(xiě)它:for (int i = 0; i < 10; i+)Console.WriteLine(i);初始化(int i = 0)只在循環(huán)開(kāi)始時(shí)發(fā)生一次。如果布爾表達(dá)式(i < 10)的求值結(jié)果為tru
22、e,就運(yùn)行語(yǔ)句(Console.WriteLine(i);)。隨后,控制變量進(jìn)行更新 (i+),布爾表達(dá)式重新求值, 如果仍為true,語(yǔ)句再次執(zhí)行,控制變量更新,布爾表達(dá)式重新求值如此反復(fù)。注意三點(diǎn):初始化只發(fā)生一次;初始化后先執(zhí)行循環(huán)主體語(yǔ)句,再更新控制變量;更新控制變量后再重新求值布爾表達(dá)式。提示 和while語(yǔ)句一樣,建議總是為for循環(huán)主體使用代碼塊,即使其中只有一個(gè)語(yǔ)句。這樣一來(lái),以后添加代碼就更省心。for語(yǔ)句的三個(gè)部分都可以省略。如果省略布爾表達(dá)式,布爾表達(dá)式就默認(rèn)為true。以下for語(yǔ)句將一直運(yùn)行:for (int i = 0; ;i+)Console.WriteLine(
23、”根本停不下來(lái)!");省略初始化和更新部分會(huì)得到一個(gè)看起來(lái)很奇怪的for循環(huán),如下所示:int i = 0;for (; i < 10;)Console.WriteLine(i);i+;|疋注意for語(yǔ)句的初始化、布爾表達(dá)式和更新控制變量這三個(gè)部分必須用分號(hào)分隔,即使某個(gè)部分的實(shí)際內(nèi)容并不存在。如有必要,可在for循環(huán)中提供多個(gè)初始化語(yǔ)句和多個(gè)更新語(yǔ)句(布爾表達(dá)式只能有一個(gè))。為此,請(qǐng)用逗號(hào)分隔不同的初始化和更新語(yǔ)句,如下例所示:for (int i = 0, j = 10; i <= j; i+, j-)最后用for循環(huán)重寫(xiě)上個(gè)練習(xí)的while循環(huán):for (strin
24、g line = reader.ReadLine(); line != null; line = reader.ReadLine()source.Text += line +n';理解for語(yǔ)句作用域前面說(shuō)過(guò),可在for語(yǔ)句的“初始化”部分聲明新變量。變量作用域限制于for語(yǔ)句主體。for語(yǔ)句結(jié)束,變量消失。該規(guī)則造成兩個(gè)重要結(jié)果。首先,不能在for語(yǔ)句結(jié)束后使 用變量,因?yàn)樗巡辉谧饔糜蛑?。下面是一個(gè)例子:for (int i = 0; i < 10; i+)Console.WriteLine(i); /編譯錯(cuò)誤其次,可在兩個(gè)或更多for語(yǔ)句中使用相同變量名,因?yàn)槊總€(gè)變量都在不
25、同作用域中。F面是一個(gè)例子:for (int i = 0; i < 10; i+)for (int i = 0; i < 20; i += 2) / okay5.4 編寫(xiě)do語(yǔ)句while和for語(yǔ)句都在循環(huán)開(kāi)始時(shí)測(cè)試布爾表達(dá)式。這意味著假如首次測(cè)試布爾表達(dá)式 為false,循環(huán)主體一次都不運(yùn)行。do語(yǔ)句則不同,它的布爾表達(dá)式在每次循環(huán)之后求值,所以主體至少執(zhí)行一次。do語(yǔ)句的語(yǔ)法如下(不要忘記最后的分號(hào)):dostatementwhile (booleanExpressio;n多個(gè)語(yǔ)句構(gòu)成的循環(huán)主體必須是放在中的代碼塊。以下語(yǔ)句向控制臺(tái)輸出09,這次使用do語(yǔ)句:int i =
26、0;doConsole.WriteLine(i); i+;while (i < 10);break 語(yǔ)句禾口 continue 語(yǔ)句第4章用break語(yǔ)句跳出switch語(yǔ)句。還可用它跳出循環(huán)。執(zhí)行break后,系統(tǒng)立即終 止循環(huán),并從循環(huán)之后的第一個(gè)語(yǔ)句繼續(xù)執(zhí)行。在這種情況下,循環(huán)的“更新”和“繼續(xù)”條件都不會(huì)重新判斷。相反,continue語(yǔ)句造成當(dāng)前循環(huán)結(jié)束,立即開(kāi)始下一次循環(huán)(在對(duì)布爾表達(dá)式重新求值之后)。下面是在控制臺(tái)上輸出09的例子的另一個(gè)版本,這次使用break語(yǔ)句和continue語(yǔ)句:int i = 0;while (true)Console.WriteLine(&qu
27、ot;continue " + i);i+;if (i < 10)continue;elsebreak;這段代碼看起來(lái)讓人難受。在許多編程守則中,都建議謹(jǐn)慎使用continue語(yǔ)句,或者根本不要用,因?yàn)樗苋菀自斐呻y以理解的代碼。continue語(yǔ)句的行為還讓人捉摸不透。例如,在for語(yǔ)句中執(zhí)行continue語(yǔ)句,會(huì)在運(yùn)行for語(yǔ)句的"更新(控制變量)”部分之后, 才開(kāi)始下一次循環(huán)。下例要寫(xiě)do語(yǔ)句將正的十進(jìn)制數(shù)轉(zhuǎn)換成八進(jìn)制的字符串形式。程序基于以下算法: 將十進(jìn)制數(shù)存儲(chǔ)到變量dec中do以下事情:dec除以8,將余數(shù)存儲(chǔ)起來(lái)將dec設(shè)為上一步得到的商while d
28、ec 不等于0按相反順序合并每一次得到的余例如,要將十進(jìn)制數(shù)999轉(zhuǎn)換成八進(jìn)制,可執(zhí)行以下步驟。1. 999除以8,商124余7。2. 124除以8,商15,余4。3. 15除以8,商1余7。4. 1除以8,商0,余1。5. 按相反順序合并每一步得到的余,結(jié)果是1747。這就是999轉(zhuǎn)換成八進(jìn)制的結(jié)果。寫(xiě)do語(yǔ)句1. 在 Visual Studio 2013中打開(kāi) DoStatement項(xiàng)目,它位于"文檔”文件夾下的 Microsoft Press'Visual CSharp Step by Step'Chapter 5WindowsX'DoStatement
29、 子文件夾中。2. 在設(shè)計(jì)視圖中 MainWindow.xaml窗體。窗體左側(cè)是 number 文本框。用戶在此輸入十進(jìn)制數(shù)。單擊 Show Steps 按鈕后, 會(huì)生成該數(shù)字的八進(jìn)制形式。右側(cè)steps文本框顯示每個(gè)計(jì)算步驟的結(jié)果。3. 在“代碼和文本編輯器”窗口中顯示 的代碼。 找到 showStepsClick 方法。該方法在單擊 Show Steps 按鈕后運(yùn)行,目前為空。4. 將以下加粗顯示的代碼添加到 showStepsClick 方法中:private void showStepsClick(object sender, RoutedEventArgs e)int amount
30、= int.Parse(number.Text);steps.Text = ""string current = ""第一個(gè)語(yǔ)句使用int類型的Parse方法將number文本框的Text屬性中存儲(chǔ)的字符 串值轉(zhuǎn)換成 int 值。第二個(gè)語(yǔ)句將右側(cè)文本框steps的Text屬性設(shè)為空字符串,清除顯示的文本。第三個(gè)語(yǔ)句聲明string變量current,初始化為空字符串。該字符串存儲(chǔ)每一次do循環(huán)時(shí)生成的八進(jìn)制數(shù)位。5. 將以下加粗顯示的 do 語(yǔ)句添加到 showStepsClick 方法中:private void showStepsClick(obje
31、ct sender, RoutedEventArgs e)int amount = int.Parse(number.Text);steps.Text = ""string current = ""doint nextDigit = amount % 8;amount /= 8;int digitCode = '0' + nextDigit;char digit = Convert.ToChar(digitCode);current = digit + current;steps.Text += current + "n&quo
32、t;while (amount != 0);該算法反復(fù)計(jì)算 amount 變量除以 8 所得的余數(shù)。 每次得到的余數(shù)都是正在構(gòu)造的 新字符串的下一個(gè)數(shù)位。最終, amount 變量將減小至 0,循環(huán)結(jié)束。注意循環(huán)主 體至少執(zhí)行一次。這個(gè)“至少執(zhí)行一次”的行為正是我們所需要的,因?yàn)榧词故?數(shù)字 0,也有一個(gè)八進(jìn)制的數(shù)位。進(jìn)一步研究代碼, do 循環(huán)的第一個(gè)語(yǔ)句如下: int nextDigit = amount % 8;該語(yǔ)句聲明int變量nextDigit初始化為amount變量除以8之余。該值范圍是07。第二個(gè)語(yǔ)句如下:amount /= 8;這是復(fù)合賦值語(yǔ)句,相當(dāng)于amount = amo
33、unt / 8;。如果amount的值是999,那么在執(zhí)行這個(gè)語(yǔ)句之后,amount的值就是124。下一個(gè)語(yǔ)句是:int digitCode = 'O' + nextDigit;這個(gè)語(yǔ)句要稍微解釋一下!根據(jù) Windows操作系統(tǒng)使用的字符集,每個(gè)字符都有唯一代碼。在 Windows操作系統(tǒng)常用的字符集中,字符 '0'的代碼是整數(shù)值 48。字 符'1'的代碼是49,字符2的代碼是50,以此類推,直到字符 9,它的代碼是57。C#允許將字符當(dāng)作整數(shù)處理,允許對(duì)它們執(zhí)行算術(shù)運(yùn)算。但這樣做會(huì)將字符碼作為值使用。所以,表達(dá)式'0' + n
34、extDigit的結(jié)果是4855之間的值(記住,nextDigit 的值在07之間),對(duì)應(yīng)于等價(jià)的八進(jìn)制數(shù)位的代碼。do語(yǔ)句的第四個(gè)語(yǔ)句如下:char digit = Convert.ToChar(digitCode);該語(yǔ)句聲明char變量digit,把它初始化為 Convert.ToChar(digitCode)方法調(diào)用的結(jié)果。Convert.ToChar方法獲取字符碼(一個(gè)整數(shù)),返回與之對(duì)應(yīng)的字符。所以,假女口 digitCode 的值是 54, Convert.ToChar(digitCode)返回字符6'??傊?,do循環(huán)的前4個(gè)語(yǔ)句計(jì)算與用戶輸入的數(shù)字對(duì)應(yīng)的最低有效八進(jìn)制數(shù)
35、位(最右邊的數(shù)位)。下個(gè)任務(wù)是將這個(gè)數(shù)位添加到要輸出的字符串的前面,如下所示:current = digit + current;do循環(huán)的下一個(gè)語(yǔ)句如下:steps.Text += current + "n"該語(yǔ)句將迄今為止得到的八進(jìn)制數(shù)位添加到steps文本框中,還為每次輸出都附加換行符,使每次輸出在文本框中都單獨(dú)占一行。最后,do循環(huán)末尾用while子句對(duì)循環(huán)條件進(jìn)行求值:while (amount != 0)如果amount的值目前不為0,就開(kāi)始下一次循環(huán)。最后一個(gè)練習(xí)使用 Visual Studio 2013調(diào)試器來(lái)單步執(zhí)行上述do語(yǔ)句,幫助理解其工作原理。單步執(zhí)
36、行do語(yǔ)句1. 在打開(kāi)了 文件的“代碼和文本編輯器”窗口中,將光標(biāo)移到showStepsClick方法的第一個(gè)語(yǔ)句:int amount = int.Parse(number.Text);2. 右擊第一個(gè)語(yǔ)句,從彈出的快捷菜單中選擇“運(yùn)行到光標(biāo)處”命令。3. 窗體出現(xiàn)后,在左側(cè)文本框中鍵入999,單擊Show Steps按鈕。程序暫停運(yùn)行,Visual Studio 2013進(jìn)入調(diào)試模式?!按a和文本編輯器”窗口左 側(cè)將出現(xiàn)一個(gè)黃色箭頭,標(biāo)記出當(dāng)前要執(zhí)行的語(yǔ)句。4. 如果“調(diào)試”工具欄不可見(jiàn),請(qǐng)顯示它(選擇“視圖” | “工具欄” | “調(diào)試”)。5. 單擊“調(diào)試”工具欄的下箭頭,指向“添加或
37、移除按鈕”,選擇“窗口”,如下 圖所示。/ Inferartian logk fair t/ -c/summairy* public partial class htaimpublic MainWindowQ InitializeComponerprivate vcMid showSte匚 int amount = mt.P;stepsJert =": Uflng current :F5EMIt+Mealt廨止it鍛曲Shlft-FS口 rUMUFS諦 晰TMkmn豆用嵐耳口治軸皿工示卩一餌站Aii-ir=W9FllFid豪呦曲仙Fill十古iffl需口阿11呂罡畑-HF:R:0咤這
38、樣會(huì)在“調(diào)試”工具欄上顯示“斷點(diǎn)”按鈕。6. 單擊“斷點(diǎn)”按鈕右側(cè)的下箭頭,選擇“局部變量”,如下圖所示。 0士 QrDtrl+D. B1tUQQOG叫曲卻)0Otrl+D”KC2SffiWSi:K)CtrkShift-FD,并石監(jiān)觀侃)JEKW)衛(wèi)旦啟至LJt対CUli-D, Aw石 i7d”I1EOd+DJ(=調(diào)用堆閔口Orl+D. CJSCCtrl+Dr T回犧就coCtrl+D. M歸IntelllTrace 事做母Ctrl+Alt+Y. FinfellrTrac# 耀用ECtrlAft+¥;T碑P)ajbgp甌匚細(xì)曲Ctrl+Alt+D回Ctrl+D, RDtrl+D. D
39、t隨后將顯示下圖所示的“局部變量”窗口,其中列出了當(dāng)前方法的局部變量的名 稱、值和類型,其中包括局部變量amount。注意amount變量的值目前是 0。privals void showStepstliekfobject sender, int amount = i nt.Parsefnu mberJesct); step&Te)rt string current =«*l± # (Ji 濁DSLalemErtLMflinWiniiow!-丸-OoSuterI*- P 估rt疊<1Syft<nn.WindciW5-lCn4rc4f.BMRonc $ Q
40、, object:芻卻蘭吐”勿總彗竺寒劇出豈二 currenlnul廠7. 在“調(diào)試”工具欄上單擊“逐語(yǔ)句”按鈕(或者按功能鍵F11)。調(diào)試器將運(yùn)行當(dāng)前語(yǔ)句:int amount = int.Parse(number.Text);在“局部變量”窗口中,amount的值變成999,黃色箭頭指向下一個(gè)語(yǔ)句。8. 再次單擊“逐語(yǔ)句”按鈕。調(diào)試器運(yùn)行以下語(yǔ)句:steps.Text =""該語(yǔ)句不影響“局部變量”窗口的顯示,因?yàn)閟teps是窗體控件,不是局部變量。黃箭頭指向下一個(gè)語(yǔ)句。9. 再次單擊“逐語(yǔ)句”按鈕。調(diào)試器將運(yùn)行以下語(yǔ)句:string current = "&
41、quot;黃箭頭指向 do 循環(huán)的起始大括號(hào)。 do 循環(huán)主體有三個(gè)局部變量,即 nextDigit , digitCode 和 digit 。注意,這些局部變量在“局部變量”窗口中顯示, 而且值均為 0。10.單擊“逐語(yǔ)句”按鈕。黃箭頭指向 do 循環(huán)主體的第一個(gè)語(yǔ)句。11.單擊“逐語(yǔ)句”按鈕。調(diào)試器運(yùn)行以下語(yǔ)句:int nextDigit = amount % 8;在“局部變量”窗口中,nextDigit 的值變成 7,這是 999 除以 8 之余。12.單擊“逐語(yǔ)句”按鈕。調(diào)試器運(yùn)行以下語(yǔ)句:amount /= 8;在“局部變量”窗口中,amount 的值變成 124。13.單擊“逐語(yǔ)句
42、”按鈕。調(diào)試器運(yùn)行以下語(yǔ)句:int digitCode = '0' + nextDigit;在“局部變量”窗口中,digitCode 變量的值變成 55。這是 '7'的字符碼 (48 + 7)。14.單擊“逐語(yǔ)句”按鈕。調(diào)試器運(yùn)行以下語(yǔ)句:char digit = Convert.ToChar(digitCode);在“局部變量”窗口中, digit 的值變?yōu)?'7'?!熬植孔兞俊贝翱谕瑫r(shí)顯示char 值的數(shù)值形式 (本例是 55)和字符形式 (本例是 '7')。注意,在“局部變量”窗口中, current 變量的值仍是 &quo
43、t;" 。15.單擊“逐語(yǔ)句”按鈕。調(diào)試器運(yùn)行以下語(yǔ)句: current = current + digit;在"局部變量”窗口中,current的值變成"7"。16. 單擊“逐語(yǔ)句”按鈕。調(diào)試器運(yùn)行以下語(yǔ)句:steps.Text += current + "n"該語(yǔ)句在steps文本框中顯示文本"7",后跟換行符,確保以后的輸出從文本框的 下一行開(kāi)始(窗體隱藏在Visual Studio后面,所以看不到)。黃箭頭移至do循環(huán)末 尾的結(jié)束大括號(hào)。17. 單擊“逐語(yǔ)句”按鈕。黃箭頭指向while語(yǔ)句,準(zhǔn)備求值 whi
44、le條件,判斷是結(jié)束還是繼續(xù)do循環(huán)。18. 單擊“逐語(yǔ)句”按鈕。調(diào)試器運(yùn)行以下語(yǔ)句:while (amount != 0);amount的值是124,表達(dá)式124 != 0求值結(jié)果是true,所以進(jìn)行下一次循環(huán)。黃箭頭跳回do循環(huán)的起始大括號(hào)。19. 單擊“逐語(yǔ)句”按鈕。黃箭頭再次指向do循環(huán)的第一個(gè)語(yǔ)句。20. 連續(xù)單擊“逐語(yǔ)句”按 鈕,重復(fù)三次do循環(huán),觀察變量值在“局部變量”窗口中 的變化。21. 第4次循環(huán)結(jié)束時(shí),amount的值變成0,current的值變成"1747"。黃箭頭指向do 循環(huán)的while條件:while (amount != 0);amount目
45、前為0,所以表達(dá)式amount != 0求值結(jié)果為false,do循環(huán)應(yīng)該終止。22. 單擊“逐語(yǔ)句”按鈕。調(diào)試器運(yùn)行以下語(yǔ)句:while (amount != 0);如同預(yù)期的那樣,do循環(huán)終止,黃箭頭移至 showStepsClick方法的結(jié)束大括號(hào)。23. 單擊工具欄上的“繼續(xù)”按鈕,或者從“調(diào)試”菜單選擇“繼續(xù)”。窗體隨后將出現(xiàn),顯示為創(chuàng)建999的八進(jìn)制形式所經(jīng)歷的 4個(gè)步驟:"7","47","747"和"1747"(參見(jiàn)下圖)。?;?u number24閔回<sua-sEdo'2013kM
46、。while, for 禾口 do本章講述了如何使用復(fù)合賦值操作符更新數(shù)值變量;講述了如何使用 語(yǔ)句在布爾條件為true的前提下重復(fù)執(zhí)行代碼。如果希望繼續(xù)學(xué)習(xí)下一章,請(qǐng)繼續(xù)運(yùn)行Visual Studio 2013,然后閱讀第6章。如果希望現(xiàn)在就退出 Visual Studio 2013,請(qǐng)選擇“文件”| “退出”。如果看到“保存”對(duì)話框,請(qǐng)單擊“是”按鈕保存項(xiàng)目。第5章快速參考目標(biāo)操作在變量(variable)上加一個(gè)值(amount)使用復(fù)合加法操作符。示例如下:variable += amount;從變量(variable)中減一個(gè)值(amount)使用復(fù)合減法操作符。示例如下:varia
47、ble -= amount;條件為true時(shí)運(yùn)行一個(gè)或多個(gè)語(yǔ)句使用while語(yǔ)句。示例如下:int i = 0;while (i < 10)Console.WriteLine(i); i+;還可使用for語(yǔ)句。示例如下:for (int i = 0; i < 10; i+)Console.WriteLine(i);一次或反復(fù)多次執(zhí)行語(yǔ)句使用do語(yǔ)句。示例如下:int i = 0;doConsole.WriteLine(i); i+;while (i < 10);第 6 章 管理錯(cuò)誤和異常本章旨在教會(huì)你:使用 try, catch 和 finally 語(yǔ)句處理異常使用 chec
48、ked 和 unchecked 關(guān)鍵字控制整數(shù)溢出使用 throw 關(guān)鍵字從方法中拋出異常使用 finally 塊寫(xiě)總是運(yùn)行的代碼 (即使在發(fā)生異常之后 )之前學(xué)習(xí)了執(zhí)行常規(guī)任務(wù)所需的核心C# 語(yǔ)句,這些常規(guī)任務(wù)包括編寫(xiě)方法, 聲明變量,用操作符創(chuàng)建值,用if和switch語(yǔ)句選擇運(yùn)行代碼,以及用while、for和do語(yǔ)句重復(fù)運(yùn)行代碼。但一直沒(méi)有提到程序可能出錯(cuò)的問(wèn)題。事實(shí)上,很難保證代碼總是像希望的那樣工作。有許多原因造成出錯(cuò),其中許多不是 程序員能控制的。 任何應(yīng)用程序都必須能檢測(cè)錯(cuò)誤, 并以得體的方式處理: 要么進(jìn)行糾正; 如果糾正不了,也要用最清楚的方式報(bào)告出錯(cuò)原因。作為第I部分的最
49、后一章,本章要講 述C#如何通過(guò)拋出異常來(lái)通知發(fā)生了錯(cuò)誤,如何使用try, catch和fin ally語(yǔ)句捕捉和處理這些異常所代表的錯(cuò)誤。通過(guò)本章的學(xué)習(xí),將進(jìn)一步掌握C#語(yǔ)言,為順利學(xué)習(xí)第n部分的內(nèi)容打下堅(jiān)實(shí)的基礎(chǔ)。6.1 處 理 錯(cuò) 誤生活并非總是一帆風(fēng)順。輪胎可能扎破,電池可能耗盡,螺絲起子并非總在老地方, 應(yīng)用程序的用戶可能采取了出乎預(yù)料的操作。在計(jì)算機(jī)世界里,磁盤(pán)可能出故障,編寫(xiě)不 當(dāng)?shù)某绦蚩赡苡绊憴C(jī)器上運(yùn)行的其他應(yīng)用程序(比如由于程序 bug 造成耗盡所有內(nèi)存 ),無(wú)線網(wǎng)絡(luò)可能在最不恰當(dāng)?shù)臅r(shí)刻斷開(kāi)連接,甚至一些自然現(xiàn)象(比如附近的一次閃電 )也會(huì)造成電源或網(wǎng)絡(luò)故障。錯(cuò)誤可能在程序運(yùn)
50、行的任何階段發(fā)生,其中許多都不是程序本身的問(wèn) 題。那么,如何檢測(cè)并嘗試修復(fù)呢?人們多年來(lái)為此研發(fā)了大量機(jī)制。 早期系統(tǒng) (如 UNIX) 采用的典型方案要求在每次方法 出錯(cuò)時(shí)都由操作系統(tǒng)設(shè)置一個(gè)特殊全局變量。每次調(diào)用方法后都檢查全局變量,判斷方法 是否成功。和大多數(shù)面向?qū)ο缶幊陶Z(yǔ)言一樣,C#沒(méi)有使用這種痛苦的、折磨人的方式處理錯(cuò)誤。相反,它使用的是 異常。為了寫(xiě)可靠的 C#應(yīng)用程序,必須很好地掌握異常。6.2 嘗試執(zhí)行代碼和捕捉異常錯(cuò)誤任何時(shí)候都可能發(fā)生,使用傳統(tǒng)技術(shù)為每個(gè)語(yǔ)句手動(dòng)添加錯(cuò)誤檢測(cè)代碼,不僅勞神費(fèi)力,還很容易出錯(cuò)。另外,如果每個(gè)語(yǔ)句都需要錯(cuò)誤處理邏輯來(lái)管理每個(gè)階段都可能 發(fā)生的每個(gè)
51、錯(cuò)誤,會(huì)很容易迷失方向,失去對(duì)程序主要流程的把握。幸好,在C#中利用異常和異常處理程序,可以很容易地區(qū)分實(shí)現(xiàn)程序主邏輯的代碼與處理錯(cuò)誤的代碼。為了寫(xiě)支持異常處理的應(yīng)用程序,要做下面兩件事。1. 代碼放到try塊中(try是C#關(guān)鍵字)。代碼運(yùn)行時(shí),會(huì)嘗試執(zhí)行try塊內(nèi)的所有語(yǔ)句。如果沒(méi)有任何語(yǔ)句產(chǎn)生異常,這些語(yǔ)句將一個(gè)接一個(gè)運(yùn)行,直到全部完成。但一 旦出現(xiàn)異常,就跳出try塊,進(jìn)入一個(gè)catch處理程序中執(zhí)行。2. 緊接著try塊寫(xiě)一個(gè)或多個(gè)catch處理程序(catch也是C#關(guān)鍵字)來(lái)處理可能發(fā)生的錯(cuò)誤。每個(gè)catch處理程序都捕捉并處理特定類型的異常,可在try塊后面寫(xiě)多個(gè)catch處理
52、程序。try塊中的任何語(yǔ)句造成錯(cuò)誤,"運(yùn)行時(shí)”都會(huì)生成并拋出異常。 然后,“運(yùn)行時(shí)”檢查try塊之后的catch處理程序,將控制權(quán)移交給匹配的處理程序。下例在try塊中嘗試將文本框中的內(nèi)容轉(zhuǎn)換成整數(shù)值,調(diào)用方法計(jì)算值,將結(jié)果寫(xiě)入另一個(gè)文本框。為了將字符串轉(zhuǎn)換成整數(shù),要求字符串包含一組有效的數(shù)位,而不能是一組 隨意的字符。如果字符串包含無(wú)效字符,int.Parse方法拋出FormatException異常,并將控制權(quán)移交給對(duì)應(yīng)的catch處理程序。catch處理程序結(jié)束后,程序從整個(gè)try/catch塊之后的第一個(gè)語(yǔ)句繼續(xù)。注意,如果沒(méi)有和異常對(duì)應(yīng)的處理程序,就說(shuō)異常未處理(稍后會(huì)討論
53、這種情況)。tryint leftHandSide = int.Parse(lhsOperand.Text);int rightHandSide = int.Parse(rhsOperand.Text);int answer = doCalculation(leftHandSide, rightHandSide); result.Text = answer.ToString();catch (FormatException fEx)/處理異常catch處理程序采用與方法參數(shù)相似的語(yǔ)法指定要捕捉的異常。在前例中,一旦拋出 FormatException異常,fEx變量就會(huì)被填充一個(gè)對(duì)象,其中包含
54、了異常細(xì)節(jié)。FormatException 類型提供大量屬性供檢查造成異常的確切原因。其中不少屬性是所有異常通用的。例如, Message屬性包含錯(cuò)誤的文本描述。處理異常時(shí)可利用這些信息,例如可以把細(xì)節(jié)記錄到 日志文件,或者向用戶顯示有意義的消息,并要求重新輸入。譯注:本書(shū)按照約定俗成的譯法,將exception handler翻譯成“異常處理程序”,但請(qǐng)把它理解成“用于異常處理的構(gòu)造”同樣的道理也適用于“ catch處理程序”,它其實(shí)是指“ catch構(gòu)造”。621 未處理的異常如果try塊拋出異常,但沒(méi)有對(duì)應(yīng)的catch處理程序,那么會(huì)發(fā)生什么?在前例中,IhsOperand文本框可能確實(shí)
55、包含一個(gè)整數(shù),但該整數(shù)超出了C#允許的整數(shù)范圍(例如"2147483648")。在這種情況下,int.Parse 語(yǔ)句會(huì)拋出 OverflowException 異常,而 catch 處 理程序目前只能捕捉 FormatException異常。如果try塊是某個(gè)方法的一部分,那個(gè)方法將 立即退出,并返回它的調(diào)用方法。如果它的調(diào)用方法有 try塊,“運(yùn)行時(shí)”會(huì)嘗試定位try塊之后的一個(gè)匹配 catch處理程序并執(zhí)行。如果調(diào)用方法沒(méi)有try塊,或者沒(méi)有找到匹配的catch處理程序,調(diào)用方法退出,返回它的更上一級(jí)的調(diào)用方法以此類推。如果最后找 到了匹配的catch處理程序,就運(yùn)行它,然后從捕捉(到異常的)方法的catch處理程序之后的第一個(gè)語(yǔ)句繼續(xù)執(zhí)行。迢重要提示捕捉了異常之后,將從 “捕捉方法”中的catch處理程序之后的第一個(gè)語(yǔ)句繼續(xù),這個(gè)catch處理程序是實(shí)際捕捉到異常的catch塊??刂撇粫?huì)回到造成異常的方法。由內(nèi)向外遍歷了所有調(diào)用方法之后,如果還是找不到匹配的catch處理程序
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 寶峰小學(xué)體育22田徑組訓(xùn)練教案
- 跨文化溝通在足浴店團(tuán)隊(duì)中的實(shí)踐與應(yīng)用
- 食品超市的貨架衛(wèi)生與安全規(guī)范
- 工程經(jīng)濟(jì)呂正輝呂正輝67課件
- 南大版一年級(jí)心理健康第11課《我要舉手發(fā)言》課件
- 6.2多彩的職業(yè)課件- -2024-2025學(xué)年統(tǒng)編版道德與法治九年級(jí)下冊(cè)
- 6.1學(xué)無(wú)止境課件- -2024-2025學(xué)年統(tǒng)編版道德與法治九年級(jí)下冊(cè)
- 建筑工程安全管理模板工程坍塌案例課件
- APx515音頻分析儀儀器AP培訓(xùn)資料
- 湖北警官學(xué)院《大數(shù)據(jù)平臺(tái)核心技術(shù)》2023-2024學(xué)年第二學(xué)期期末試卷
- VTE防治在臨床科室的落地
- 2025年度個(gè)人住房買賣合同(帶家居家具)
- (新版)廣電全媒體運(yùn)營(yíng)師資格認(rèn)證考試復(fù)習(xí)題庫(kù)(含答案)
- 2024年法律職業(yè)資格考試(試卷一)客觀題試卷與參考答案
- 安全生產(chǎn)重大事故隱患排查報(bào)告表
- 電纜敷設(shè)施工方案及安全措施范文
- 市場(chǎng)營(yíng)銷課程標(biāo)準(zhǔn)
- ppt模板:信保專用中國(guó)出口信用保險(xiǎn)公司課件
- 2021年四川省綿陽(yáng)市中考物理真題及答案
- 小學(xué)音樂(lè)課后服務(wù)教學(xué)設(shè)計(jì)方案計(jì)劃
- 人教版八年級(jí)數(shù)學(xué)下冊(cè)全冊(cè)教案(完整版)教學(xué)設(shè)計(jì)
評(píng)論
0/150
提交評(píng)論