|
本節(jié)課將介紹如何使用C#選擇控制語句,第三課將達(dá)到如下幾個(gè)目的: 1.學(xué)會(huì)"if"語句的用法。
2.學(xué)會(huì)"switch"語句的用法。
3.學(xué)會(huì)在"switch"語句中如何使用"break"語句。
4.理解"goto"語句的正確用法。
在前面幾節(jié)課中,你所看到的程序都是順序執(zhí)行的。你無法控制輸入語句,你所能做的就是跟著程序執(zhí)行直到終止。本節(jié)課中,將介紹基于條件進(jìn)行判斷,從而選擇進(jìn)入相應(yīng)的邏輯分支中去執(zhí)行。
我們所介紹的第一個(gè)選擇語句是"if"語句,它有三種基本形式:?jiǎn)螚l選擇, 如果/否則,以及多情形選擇。
1.清單3-1. IF語句的格式:IfSelection.cs
using System; class IfSelect { public static void Main() { string myInput; int myInt; Console.Write("Please enter a number: "); myInput = Console.ReadLine(); myInt = Int32.Parse(myInput); // Single Decision and Action with brackets if (myInt > 0) { Console.WriteLine("Your number {0} is greater than zero.", myInt); } // Single Decision and Action without brackets if (myInt < 0) Console.WriteLine("Your number {0} is less than zero.", myInt); // Either/Or Decision if (myInt != 0) { Console.WriteLine("Your number {0} is not equal to zero.", myInt); } else { Console.WriteLine("Your number {0} is equal to zero.", myInt); } // Multiple Case Decision if (myInt < 0 || myInt == 0) { Console.WriteLine("Your number {0} is less than or equal to zero.", myInt); } else if (myInt > 0 && myInt <= 10) { Console.WriteLine("Your number {0} is between 1 and 10.", myInt); } else if (myInt > 10 && myInt <= 20) { Console.WriteLine("Your number {0} is between 11 and 20.", myInt); } else if (myInt > 20 && myInt <= 30) { Console.WriteLine("Your number {0} is between 21 and 30.", myInt); } else { Console.WriteLine("Your number {0} is greater than 30.", myInt); } } }
說明
1.清單3-1中的IF語句的各種格式都使用了同一個(gè)輸入變量"myInt"。
這是從用戶獲得交互內(nèi)容的另一種方式。我們首先輸出一行信息:"Please enter a number:"到控制臺(tái)。"Console.ReadLine()"語句使得程序等待來自用戶的輸入,一旦用戶輸入一個(gè)數(shù)字,按回車鍵之后,該數(shù)字以字符串的形式返回到"myInput"變量中,由于我們需要的是一個(gè)整數(shù),所以需要轉(zhuǎn)換變量"myInput"成整型數(shù)據(jù)。用命令"Int32.Parse(myInput)"即可完成。 (Int32 等數(shù)據(jù)類型將在后面的課程中加以介紹。) 轉(zhuǎn)換結(jié)果放到"myInt"變量中,這是個(gè)整數(shù)類型。
2.有了我們所需要的類型的數(shù)據(jù),就可以用"if"語句來進(jìn)行條件判斷了。
對(duì)于第一種形式的IF語句,格式為: if (boolean expression) { statements }。該語句必須以關(guān)鍵字"if"開始。之后,括號(hào)中為布爾表達(dá)式。該布爾表達(dá)式必須計(jì)算出一個(gè)true或者false值。在本例中,我們檢查用戶的輸入,看看輸入值是否大于0,如果表達(dá)式運(yùn)算結(jié)果為true,就執(zhí)行大括號(hào)中的語句。(我們把大括號(hào)之間的語句部分稱為"block"。) 塊中有一個(gè)或者多個(gè)語句。如果布爾表達(dá)式的值為false,我們就忽略塊中的語句,直接執(zhí)行塊后面的語句。
3.除了沒有塊之外,第二種"if"語句的格式非常類似于第一種。
因此,如果布爾表達(dá)式為true,將會(huì)執(zhí)行布爾表達(dá)式之后的第一條語句。當(dāng)布爾表達(dá)式的值為false,布爾表達(dá)式之后的第一條語句將被忽略掉,而直接執(zhí)行其后的程序語句。如果你只有一條語句需要執(zhí)行,就用該格式的"if"語句。如果你打算在布爾表達(dá)式的值為true時(shí),執(zhí)行兩條或者兩條以上的語句,就必須把它們放到塊中。我個(gè)人的建議是:無論需要執(zhí)行幾條語句,要養(yǎng)成把if語句放到塊中的習(xí)慣, 這就使得你避免犯如下錯(cuò)誤:當(dāng)添加了一條語句之后,忘記了添加一對(duì)括號(hào)。
4.大多數(shù)時(shí)候,你需要作出如下選擇:當(dāng)條件滿足時(shí)做一件事,否則做另外一件事。
清單3-1中,程序演示了這種if語句格式的用法。 當(dāng)布爾表達(dá)式為true時(shí), 就立刻執(zhí)行"if"后面的那條語句, 而當(dāng)布爾表達(dá)式為false時(shí),就執(zhí)行"else"關(guān)鍵字后面的語句。
5.當(dāng)要計(jì)算多個(gè)布爾表達(dá)式時(shí),你可以使用if/else if/else 這種格式,上面的例子程序演示了這種形式,從關(guān)鍵字"if"開始, 一旦布爾表達(dá)式為真,就執(zhí)行if后面的塊。但是,這一次,在組合關(guān)鍵字"else if"后面還可以進(jìn)行多個(gè)條件的判斷。"else if"語句后面也有個(gè)布爾表達(dá)式,一旦該布爾表達(dá)式的值為true,就會(huì)執(zhí)行緊接其后的塊。這種情形可以一直持續(xù)下去,直到所有的情況都已經(jīng)計(jì)算出來,但是整個(gè)"if/else if"序列必須以"else"結(jié)束。當(dāng)所有的"if"或者"else if" 后面的布爾表達(dá)式的值都為false時(shí),就執(zhí)行關(guān)鍵字"else"后面的塊。 對(duì)于if/else if/else格式的語句,每次僅僅執(zhí)行一個(gè)其中部分的語句 。
6.上面的例子中,布爾表達(dá)式 (myInt < 0 || myInt == 0)包含了條件OR (||)運(yùn)算符。
對(duì)于常規(guī)OR (|)運(yùn)算符和條件OR (||)運(yùn)算符來說,只要有運(yùn)算符兩邊的子表達(dá)式之一為真,整個(gè)布爾表達(dá)式的值就為真。兩個(gè)運(yùn)算符的區(qū)別在于:正規(guī)OR 運(yùn)算符(|)每次都對(duì)運(yùn)算符(|)兩邊的表達(dá)式進(jìn)行計(jì)算。而條件運(yùn)算符OR (||)只有當(dāng)?shù)谝粋(gè)子表達(dá)式的值為false時(shí),才計(jì)算第二個(gè)子表達(dá)式的值。
7.布爾表達(dá)式 (myInt > 0 && myInt <= 10)包含了條件運(yùn)算符AND。
對(duì)于常規(guī)AND (&) 運(yùn)算符和條件AND (&&)運(yùn)算符來說,只有當(dāng)運(yùn)算符兩邊的子表達(dá)式的值都為真時(shí),整個(gè)布爾表達(dá)式的值為真。兩種運(yùn)算符的區(qū)別在于:正規(guī)AND (&)運(yùn)算符每次都計(jì)算運(yùn)算符兩邊的子表達(dá)式的值,但是對(duì)于條件AND運(yùn)算符來說,只有當(dāng)?shù)谝粋(gè)子表達(dá)式的值為真時(shí),才計(jì)算第二個(gè)表達(dá)式的值。條件運(yùn)算符(&& 和 ||) 通常稱為運(yùn)算優(yōu)化的運(yùn)算符,因?yàn)橛袝r(shí)不需要計(jì)算整個(gè)表達(dá)式的值。這樣就可以忽略掉不必要的邏輯表達(dá)式的計(jì)算,可以生成有效的代碼。
同if/else if/else 格式的"if"語句類似,"switch"語句的用法如下:
2.清單3-2. 分支選擇語句: SwitchSelection.cs
using System; class SwitchSelect { public static void Main() { string myInput; int myInt;
begin: Console.Write("Please enter a number between 1 and 3: "); myInput = Console.ReadLine(); myInt = Int32.Parse(myInput); // switch with integer type switch (myInt) { case 1: Console.WriteLine("Your number is {0}.", myInt); break; case 2: Console.WriteLine("Your number is {0}.", myInt); break; case 3: Console.WriteLine("Your number is {0}.", myInt); break; default: Console.WriteLine("Your number {0} is not between 1 and 3.", myInt); }
decide: Console.Write("Type \"continue\" to go on or \"quit\" to stop: "); myInput = Console.ReadLine(); // switch with string type switch (myInput) { case "continue": goto begin; case "quit": Console.WriteLine("Bye."); break; default: Console.WriteLine("Your input {0} is incorrect.", myInput); goto decide; } } }
說明
1.清單3-2 演示了多分支選擇語句switch的用法。
關(guān)鍵字"switch"后面是switch 表達(dá)式。Switch表達(dá)式必須是以下類型中的一種: sbyte,byte,short,ushort, int,uint,long,ulong,char,string,或者enum類型。(enum類型將在后面的課程中加以介紹)。在清單3-2的第一個(gè)"switch"語句中, switch 表達(dá)式計(jì)算的是整數(shù)類型的數(shù)據(jù)。
2.在switch表達(dá)式后面是個(gè)switch 塊, 當(dāng)Switch表達(dá)式的值同某一個(gè)case后面的常量表達(dá)式的值相匹配時(shí),就執(zhí)行此case后面的語句,直到遇到"break"語句或者"goto"語句為止。每個(gè)分支以關(guān)鍵字"case"作為標(biāo)號(hào),其后為常量表達(dá)式,然后是分號(hào)(:)。本例子程序中,我們有"case 1:","case 2:"和"case 3:"。
3.你可以在所有的分支選擇的后面加上一個(gè)"default"分支。
如果沒有匹配的常量表達(dá)式,就進(jìn)入default分支,并執(zhí)行該分支的語句。雖然default標(biāo)號(hào)是可選的,我建議你加上該分支。這將有助于處理一些意外事件 ,使得你的程序能夠捕捉和處理不可預(yù)見的事件,從而使得程序更加可靠。
4.每個(gè)"case"標(biāo)號(hào)必須以"break"語句作為結(jié)束。
"break"語句將使得程序退出switch語句,并從switch塊后面的一條語句開始執(zhí)行。對(duì)于"default"標(biāo)號(hào)來說,"break"語句是可選的,因?yàn)橛?quot;break"語句和沒有"break"語句,其運(yùn)行結(jié)果是一樣的。如果你在switch塊中放置了一個(gè)"goto"語句,情況就不一樣了。
5.清單3-2中的第二個(gè)"switch"語句演示了"goto"語句的用法。
"goto"語句可以讓程序跳到關(guān)鍵字"goto"后面的標(biāo)號(hào)中去執(zhí)行。程序執(zhí)行過程中,如果用戶打入"continue", switch語句就匹配case "continue" 中的常量表達(dá)式,并執(zhí)行"goto begin:"語句。程序就會(huì)離開"switch"語句,開始執(zhí)行標(biāo)號(hào)"begin:"后的第一條語句。這是個(gè)有效的循環(huán),可以讓你多次重復(fù)執(zhí)行同樣一段代碼。一旦用戶打入字符串"quit",循環(huán)將會(huì)結(jié)束。此時(shí),將進(jìn)入case "quit" 分支。該分支將輸出信息"Bye."到控制臺(tái)上,之后跳出switch語句,再結(jié)束程序。
一旦輸入的字符串既不是"continue"也不是"quit",就會(huì)進(jìn)入"default:"分支。于是,將會(huì)輸出一個(gè)出錯(cuò)信息到控制臺(tái)上,之后執(zhí)行"goto decide:"命令。這就使得程序轉(zhuǎn)跳到"decide:" 標(biāo)號(hào)后面的第一條語句, 該語句執(zhí)行后,將會(huì)詢問用戶是否愿意continue(繼續(xù))還是 quit(退出)。這是個(gè)有效的循環(huán)。
顯然,"goto"語句功能強(qiáng)大,在受控的場(chǎng)合下,"goto"語句是很有用途的。但是,必須指出的是,"goto"如果出現(xiàn)被濫用的趨勢(shì),程序的調(diào)試和維護(hù)將會(huì)變得很困難。想象一下,如果程序到處可見goto語句,其流程將會(huì)變得難以閱讀和理解。下節(jié)課中,將介紹在程序中創(chuàng)建循環(huán)語句的更好方法。
小結(jié) 現(xiàn)在,你已經(jīng)了解了如何使用"if"語句的各種格式,也了解了如何使用"switch"語句。你也了解了使用"break"語句可以從"switch"語句中推出。最后,你也了解了如何使用"goto"語句跳到程序的另外一
|
溫馨提示:喜歡本站的話,請(qǐng)收藏一下本站!