C# Notizen 7 控制程序流程

所有控制流程語句都具有相同的基本特征:根據(jù)一組條件選擇要執(zhí)行的語句厂财。這些語句分三大類助隧,并通過其主要行為進(jìn)行描述。選擇語句和跳轉(zhuǎn)語句最接近虐块,它們選擇的語句都只執(zhí)行一次,而迭代語句重復(fù)執(zhí)行語句阱缓。跳轉(zhuǎn)語句無條件地進(jìn)行跳轉(zhuǎn)非凌,選擇語句根據(jù)條件選擇要執(zhí)行的語句,而迭代語句根據(jù)條件決定執(zhí)行語句多少次荆针。

一敞嗡、選擇語句
1.1 if語句
if語句是最基本的選擇語句颁糟,它根據(jù)一個布爾表達(dá)式的結(jié)果選擇執(zhí)行一條語句。
if語句的基本語法如下:

if ( boolean-expression )
embedded-statement

稍微復(fù)雜一點的語法如下:

if(boolean-expression)
     consequence-statement
else
     alternative-statement

如果boolean-expression的結(jié)果為true喉悴,就執(zhí)行consequence-statement棱貌;如果boolean-expression的結(jié)果為false,且有else部分箕肃,就執(zhí)行alternative-statement婚脱。到達(dá)被執(zhí)行的語句末尾后,將執(zhí)行if語句后面的語句勺像。
被執(zhí)行的語句可以是任何有效的語句障贸,包括另一條if語句。在這種情況下吟宦,這條if語句稱為嵌套if語句篮洁。

ps:else語句不匹配
編寫 if 語句時,一種常見的問題是 else 語句不匹配殃姓,即代碼的縮進(jìn)格式與實際的控制流程不匹配袁波。為幫助避免這種問題,最好使用大括號清楚地指出 else 語句對應(yīng)的 if語句蜗侈。檢查一系列互斥的條件時篷牌,可級聯(lián)if語句,即在else部分使用另一個if語句踏幻。在這種情況下枷颊,將按順序檢查條件,直到遇到結(jié)果為true的條件该面。

1.2 switch語句
可將switch語句視為級聯(lián)if語句的自然進(jìn)化結(jié)果偷卧,其功能與級聯(lián)if語句類似,但更簡潔吆倦、更靈活。switch語句執(zhí)行與表達(dá)式值相等的標(biāo)簽指定的語句列表坐求。
switch語句的語法如下:

switch ( expression )
{
     case constant-expression     :
          statement-list
          break;
     
     default     :
          statement-list
          break;
}

switch語句體稱為switch塊蚕泽,包含一個或多個switch段。每個switch段至少包含一個標(biāo)簽桥嗤,標(biāo)簽后面是一個語句列表须妻。
expression的類型稱為 switch語句的支配類型(governing type),可以是 sbyte泛领、byte荒吏、short、ushort渊鞋、int绰更、uint瞧挤、long、ulong儡湾、char及其可以為null的版本特恬,還可以為string或枚舉類型。expression只計算一次徐钠。
switch段的標(biāo)簽必須是常量表達(dá)式癌刽、在switch塊中是唯一的且可顯式地轉(zhuǎn)換為支配類型。如果switch語句的支配類型為string或可以為null的類型尝丐,就可包含case標(biāo)簽null显拜。
ps:支配類型為string的switch語句
expression 的結(jié)果是區(qū)分大小寫,因此僅當(dāng)標(biāo)簽與 expression 完全匹配時爹袁,才會執(zhí)行相應(yīng)的switch段远荠。
如果expression的值與case標(biāo)簽中的常量匹配,就將首先執(zhí)行該標(biāo)簽后面的第一條語句呢簸。如果沒有匹配的case標(biāo)簽矮台,且有default標(biāo)簽,就將執(zhí)行該標(biāo)簽后的第一條語句根时;否則將執(zhí)行switch語句后面的語句瘦赫。

ps:連續(xù)執(zhí)行
不同于 C 和 C++等編程語言,C# switch 語句不允許連續(xù)執(zhí)行(fall through)switch段蛤迎,即從一個switch段執(zhí)行到下一個switch段确虱。
為禁止連續(xù)執(zhí)行,C#要求所有switch段都以有不可達(dá)終點(unreachable endpoint)的語句結(jié)束替裆。一條這樣的語句是無條件跳轉(zhuǎn)語句校辩,但最常用的是break語句。
通過禁止連續(xù)執(zhí)行辆童,C#消除了C和C++程序中一種常見的錯誤宜咒,并使得調(diào)整swith段的順序不會影響switch語句的行為。

ps:作用域
在switch語句中把鉴,整個switch塊是一個作用域故黑,而每個switch段不形成作用域。這意味著在 switch 段中聲明變量或常量時庭砍,其作用域為整個switch塊场晶,而不是當(dāng)前switch段。
如果要將變量或常量的作用域限定為當(dāng)前 switch 段怠缸,可用大括號將該switch段的語句列表括起诗轻。

二、迭代語句
選擇語句是根據(jù)表達(dá)式的值選擇語句并執(zhí)行一次揭北,而迭代語句(也叫循環(huán)語句)重復(fù)執(zhí)行語句多次扳炬。在循環(huán)的每次迭代中吏颖,迭代語句都計算表達(dá)式的值。開始測試循環(huán)(top-tested loop)在執(zhí)行語句前計算表達(dá)式的值鞠柄,而結(jié)束測試循環(huán)(bottom-tested loop)在執(zhí)行語句后計算表達(dá)式的值侦高。
要提前結(jié)束循環(huán),而不重新計算表達(dá)式的值厌杜,可使用下述跳轉(zhuǎn)語句之一:break奉呛、goto、return和throw夯尽。continue語句直接進(jìn)行下一次迭代瞧壮。

2.1 while語句
while語句屬于開始測試循環(huán),它不斷執(zhí)行嵌套的語句匙握,直到boolean-expression為false咆槽。由于每次迭代前都計算表達(dá)式的值,因此嵌套的語句將執(zhí)行零次或多次圈纺。
while語句的語法如下:

while ( boolean-expression )
embedded-statement

如果boolean-expression為true秦忿,就將執(zhí)行embedded-statement;執(zhí)行完畢后蛾娶,將重新回到循環(huán)開頭灯谣,并再次計算表達(dá)式的值。
如果 boolean-expression 為 false 蛔琅,就將接著執(zhí)行 while 語句后面的語句胎许。如果boolean-expression一開始就為false,那么embedded-statement一次也不會執(zhí)行罗售。

2.2 do語句
do語句也重復(fù)執(zhí)行嵌套的語句辜窑,直到boolean-expression為false。不同于while語句寨躁,do語句屬于結(jié)束測試循環(huán)穆碎,因此在計算boolean-expression前,embedded-statements已執(zhí)行一次职恳。這意味著嵌套的語句至少會執(zhí)行一次惨远。
do語句的語法如下:

do
embedded-statement
while ( boolean-expression );

如果boolean-expression為true,就將轉(zhuǎn)到循環(huán)開頭再次執(zhí)行embedded-statements话肖;否則,將跳轉(zhuǎn)到do語句后面的語句處繼續(xù)執(zhí)行葡幸。

2.3 for語句
for語句可能是被人誤解最深的迭代語句最筒,因為它看起來最復(fù)雜,但其基本行為與其他迭代語句相同蔚叨。它也不斷執(zhí)行嵌套的語句床蜘,直到指定的表達(dá)式為false辙培。
for語句的語法如下:

for ( initializer ; condition ; iterator )
embedded-statement

for語句最常用于順序處理數(shù)組。
導(dǎo)致for語句看起來很復(fù)雜的原因是它包含3個表達(dá)式邢锯,這些表達(dá)式都是可選的扬蕊。表達(dá)式之間必須用分號分隔,即使表達(dá)式省略了也必須如此丹擎。
初始化表達(dá)式可初始化一個局部變量尾抑,也可初始化多個局部變量,在后一種情況下蒂培,必須用逗號將變量初始化語句分開再愈。對于在初始化表達(dá)式中聲明的局部變量,其作用域為條件护戳、迭代器和嵌套語句翎冲。

ps:初始化表達(dá)式聲明空間
可將整個for語句視為是在一對看不到的大括號內(nèi)定義的,這對大括號為初始化表達(dá)式定義了局部變量聲明空間媳荒。
條件(condition)必須是布爾表達(dá)式抗悍,如果省略了它,就認(rèn)為該表達(dá)式為true钳枕。
最后缴渊,迭代器(iterator)可以是單個表達(dá)式,也可以是用逗號分隔的表達(dá)式列表么伯,這些表達(dá)式的值通常取決于初始化表達(dá)式中聲明的局部變量疟暖。

ps:無限循環(huán)
就像使用while語句可能創(chuàng)建無限循環(huán)一樣,也可使用for語句創(chuàng)建不斷運行的循環(huán)田柔,方法是省略全部3個表達(dá)式:

for (     ;     ;     ;     )
{
     Console.WriteLine(“l(fā)ine”);
}

while語句和for語句可互換俐巴,但是for語句更簡潔。
在for語句中硬爆,發(fā)生的事件與while語句相同

  • 如果有初始化表達(dá)式欣舵,就執(zhí)行它。如果有多個表達(dá)式缀磕,就將按順序執(zhí)行它們缘圈。初始化表達(dá)式只在開始執(zhí)行for語句時執(zhí)行一次。
  • 如果條件為true袜蚕,就跳轉(zhuǎn)到嵌套的語句糟把。
  • 執(zhí)行嵌套的語句。
  • 執(zhí)行迭代器語句并重新判斷條件牲剃。如果條件為false遣疯,就跳轉(zhuǎn)到for語句后面的語句。

2.4 foreach語句
foreach語句對數(shù)組或集合中的每個元素執(zhí)行指定的語句一次凿傅。不同于for語句缠犀,foreach語句不能用于在集合中添加或刪除元素数苫。
foreach語句的語法如下:

foreach ( type identifier in expression )
embedded-statement

如果expression的類型為數(shù)組,就將執(zhí)行到IEnumberable的隱式轉(zhuǎn)換辨液;如果是集合虐急,它要么實現(xiàn)了IEnumberable或IEnumberable<T>,要么提供了合適的GetEnumerator方法滔迈。
ps:迭代變量
foreach語句中的type和identifier聲明了一個迭代變量止吁,這是一個只讀的局部變量,其作用域為嵌套的語句亡鼠。
遍歷集合中的元素時赏殃,迭代變量指向當(dāng)前元素。
在所有的迭代語句中间涵,只有 foreach 語句沒有包含條件仁热。除非有跳轉(zhuǎn)語句結(jié)束循環(huán),否則將對集合中的每個元素重復(fù)執(zhí)行嵌套語句一次勾哩。對于集合和一維數(shù)組抗蠢,將從索引零開始按升序遍歷元素。如果 expression 是多維數(shù)組思劳,就將從最右邊的那維開始按升序遍歷迅矛,并逐漸移到最左邊的那維。
如果集合沒有任何元素潜叛,就將不執(zhí)行嵌套的語句秽褒。
如下代碼顯示字符串中的每個字符,每個字符占一行

string s = “This is a test.”;

foreach (char c in s)
{
     Console.WriteLine(c);
}

三威兜、跳轉(zhuǎn)語句
跳轉(zhuǎn)語句與選擇語句销斟、迭代語句的不同之處在于,它們無條件地跳轉(zhuǎn)到指定位置—跳轉(zhuǎn)語句的目標(biāo)(target)位置椒舵。
ps:goto語句
雖然goto語句不常用蚂踊,但是C#確實提供了,它跳轉(zhuǎn)到用標(biāo)簽標(biāo)記的地方笔宿。goto語句還可跳轉(zhuǎn)到switch語句中特定的case標(biāo)簽或default標(biāo)簽處犁钟。
goto語句的語法如下:

goto identifier;
goto case constant-expression;
goto default;

與break和continue語句一樣,goto語句也將導(dǎo)致當(dāng)前語句塊中的后續(xù)語句不被執(zhí)行泼橘。
強烈建議在任何情況下都不要使用 goto 語句涝动,因為它很容易濫用,導(dǎo)致代碼難以理解和維護(hù)炬灭。大量使用 goto 語句的代碼常被稱為“意大利面條式”代碼捧存,因為程序流程就像是一盤意大利面條。

3.1 break語句
break語句用于退出最近的switch、while昔穴、do、for或foreach語句提前。如果多條這樣的語句相互嵌套吗货,就將只退出最里面的那條語句。

3.2 continue語句
continue語句進(jìn)入最近的while狈网、do宙搬、for或foreach語句的下一次迭代。如果多條這樣的語句相互嵌套拓哺,continue 語句將只用于最里面的語句勇垛,跳過 continue 語句和循環(huán)體末尾之間的所有語句。
continue語句導(dǎo)致for語句的表達(dá)式和迭代器被重新計算士鸥,明白這一點很重要闲孤。

3.3 return語句
該語句返回到其所屬成員的調(diào)用方。在return語句中可包含一個表達(dá)式烤礁,這種return語句只能用于返回類型不是void的類成員中讼积。return語句也可不包含表達(dá)式,這種return語句只能用于返回類型為void的類成員中脚仔,這包括構(gòu)造函數(shù)和終結(jié)器(finalizer)勤众。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市鲤脏,隨后出現(xiàn)的幾起案子们颜,更是在濱河造成了極大的恐慌,老刑警劉巖猎醇,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件窥突,死亡現(xiàn)場離奇詭異,居然都是意外死亡姑食,警方通過查閱死者的電腦和手機波岛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來音半,“玉大人则拷,你說我怎么就攤上這事〔莛” “怎么了煌茬?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長彻桃。 經(jīng)常有香客問我坛善,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任眠屎,我火速辦了婚禮剔交,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘改衩。我一直安慰自己岖常,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布葫督。 她就那樣靜靜地躺著竭鞍,像睡著了一般。 火紅的嫁衣襯著肌膚如雪橄镜。 梳的紋絲不亂的頭發(fā)上偎快,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天,我揣著相機與錄音洽胶,去河邊找鬼晒夹。 笑死,一個胖子當(dāng)著我的面吹牛妖异,可吹牛的內(nèi)容都是我干的惋戏。 我是一名探鬼主播,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼他膳,長吁一口氣:“原來是場噩夢啊……” “哼响逢!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起棕孙,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤舔亭,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后蟀俊,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體钦铺,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年肢预,在試婚紗的時候發(fā)現(xiàn)自己被綠了矛洞。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡烫映,死狀恐怖沼本,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情锭沟,我是刑警寧澤抽兆,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站族淮,受9級特大地震影響辫红,放射性物質(zhì)發(fā)生泄漏凭涂。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一贴妻、第九天 我趴在偏房一處隱蔽的房頂上張望切油。 院中可真熱鬧,春花似錦名惩、人聲如沸白翻。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至岛琼,卻和暖如春底循,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背槐瑞。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工熙涤, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人困檩。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓祠挫,卻偏偏與公主長得像,于是被迫代替她去往敵國和親悼沿。 傳聞我的和親對象是個殘疾皇子等舔,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,792評論 2 345

推薦閱讀更多精彩內(nèi)容

  • C++ 控制流 作者:AceTan,轉(zhuǎn)載請標(biāo)明出處! 控制流 為什么會有控制流這玩意呢糟趾?那是因為程序不總是按順序執(zhí)...
    AceTan閱讀 3,126評論 0 16
  • Swift 提供了類似 C 語言的流程控制結(jié)構(gòu)慌植,包括可以多次執(zhí)行任務(wù)的for和while循環(huán),基于特定條件選擇執(zhí)行...
    窮人家的孩紙閱讀 690評論 1 1
  • 謹(jǐn)記 每當(dāng)清晨太陽初升時义郑,那一剎那蝶柿,炙熱的陽光灑在大地,打破了大地甜美的夢鄉(xiāng)非驮,大地蘇醒了交汤,因為他知道,只有借著太陽...
    長風(fēng)留言閱讀 1,199評論 0 6
  • 每日推薦: 每日一歌――何炅《思念的距離》 每日一影――馬楚成《極速天使》 開始記錄的第一百一十九天劫笙。 極...
    薩拉芯雪閱讀 243評論 0 0
  • 敏感的蟹子時常感到委屈 為什麼受傷的總是我 躲在蟹殼裏的那顆心時時尋找著答案 其實不受關(guān)注芙扎,被周圍冷落 那又怎樣?...
    悠然_75e0閱讀 131評論 0 0