C++primer 第 5 章语句 5.2语句作用域 5.3条件语句 5 . 4 迭代语句 5.5跳转语句 5.6 try语句块和异常处理
生活随笔
收集整理的這篇文章主要介紹了
C++primer 第 5 章语句 5.2语句作用域 5.3条件语句 5 . 4 迭代语句 5.5跳转语句 5.6 try语句块和异常处理
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
5 . 1 簡(jiǎn)單語(yǔ)句
- C++語(yǔ)言中的大多數(shù)語(yǔ)句都以分號(hào)結(jié)束,一個(gè)表達(dá)式,比如ival + 5 , 末尾加上分號(hào)就變成了表達(dá)式語(yǔ)句(expression statement)。表達(dá)式語(yǔ)句的作用是執(zhí)行表達(dá)式并丟棄掉
- 求值結(jié)果:ival + 5; // 一條沒(méi)什么實(shí)際用處的表達(dá)式語(yǔ)句
- cout << ival; // 一條有用的表達(dá)式語(yǔ)句
- 第一條語(yǔ)句沒(méi)什么用處,因?yàn)殡m然執(zhí)行了加法,但是相加的結(jié)果沒(méi)被使用。比較普遍的情況是,表達(dá)式語(yǔ)句中的表達(dá)式在求值時(shí)附帶有其他效果,比如給變量賦了新值或者輸出了結(jié)果。
空語(yǔ)句
- 最簡(jiǎn)單的語(yǔ)句是空語(yǔ)句(nullstatement),空語(yǔ)句中只含有一個(gè)單獨(dú)的分號(hào):? ? ?;? ?//空語(yǔ)句
- 如果在程序的某個(gè)地方,語(yǔ)法上需要一條語(yǔ)句但是邏輯上不需要,此時(shí)應(yīng)該使用空語(yǔ)句。一種常見(jiàn)的情況是,當(dāng)循環(huán)的全部工作在條件部分就可以完成時(shí),我們通常會(huì)用到空語(yǔ)句。例如,我們想讀取輸入流的內(nèi)容直到遇到一個(gè)特定的值為止,除此之外什么事情也不做:
- while循環(huán)的條件部分首先從標(biāo)準(zhǔn)輸入讀取一個(gè)值并且隱式地檢查cin,判斷讀取是否成功。假定讀取成功,條件的后半部分檢查讀進(jìn)來(lái)的值是否等于sought的值。如果發(fā)現(xiàn)了想要的值,循環(huán)終止;否則,從cin中繼續(xù)讀取另一個(gè)值,再一次判斷循環(huán)的條件。
別漏寫分號(hào),也別多寫分號(hào)
- 因?yàn)榭照Z(yǔ)句是一條語(yǔ)句,所以可用在任何允許使用語(yǔ)句的地方。由于這個(gè)原因,某些看起來(lái)非法的分號(hào)往往只不過(guò)是一條空語(yǔ)句而已,從語(yǔ)法上說(shuō)得過(guò)去。下面的片段包含兩條語(yǔ)句:表達(dá)式語(yǔ)句和空語(yǔ)句。
- ival = vl + v2;; / / 正確:第二個(gè)分號(hào)表示一條多余的空語(yǔ)句
- 多余的空語(yǔ)句一般來(lái)說(shuō)是無(wú)害的,但是如果在if或者while的條件后面跟了一個(gè)額外的分號(hào)就可能完全改變程序員的初衷。例如,下面的代碼將無(wú)休止地循環(huán)下去:
- 無(wú)終止條件 分號(hào)使條件改變失效
- 雖然從形式上來(lái)看執(zhí)行遞增運(yùn)算的語(yǔ)句前面有縮進(jìn),但它并不是循環(huán)的一部分。循環(huán)條件后面跟著的分號(hào)構(gòu)成了一條空語(yǔ)句,它才是真正的循環(huán)體。
復(fù)合語(yǔ)句(塊)
- 復(fù)合語(yǔ)句(compoundstatement)是指用花括號(hào)括起來(lái)的(司能為空的)語(yǔ)句和聲明的序列,復(fù)合語(yǔ)句也被稱作塊(block),一個(gè)塊就是一個(gè)作用域(參見(jiàn)2.2.4節(jié),第43頁(yè)),在塊中引入的名字只能在塊內(nèi)部以及嵌套在塊中的子塊里訪問(wèn)。通常,名字在有限的區(qū)域內(nèi)可見(jiàn),該區(qū)域從名字定義處開(kāi)始,到名字所在的(最內(nèi)層)塊的結(jié)尾為止。
- 如果在程序的某個(gè)地方,語(yǔ)法上需要一條語(yǔ)句,但是邏輯上需要多條語(yǔ)句,則應(yīng)該使用復(fù)合語(yǔ)句。例如,while或者for的循環(huán)體必須是一條語(yǔ)句,但是我們常常需要在循環(huán)體內(nèi)做很多事情,此時(shí)就需要將多條語(yǔ)句用花括號(hào)括起來(lái),從而把語(yǔ)句序列轉(zhuǎn)變成塊。
- 舉個(gè)例子,回憶1.4.1節(jié)(第10頁(yè))的while循環(huán):
- 程序從邏輯上來(lái)說(shuō)要執(zhí)行兩條語(yǔ)句,但是while循環(huán)只能容納一條。此時(shí),把要執(zhí)行的語(yǔ)句用花括號(hào)括起來(lái),就將其轉(zhuǎn)換成了一條(復(fù)合)語(yǔ)句。
- 塊不可以使用分號(hào)進(jìn)行結(jié)尾
5.2語(yǔ)句作用域
- 可以在if、switch、while和for語(yǔ)句的控制結(jié)構(gòu)內(nèi)定義變量。定義在控制結(jié)構(gòu)當(dāng)中的變量只在相應(yīng)語(yǔ)句的內(nèi)部可見(jiàn),一旦語(yǔ)句結(jié)束,變量也就超出其作用范圍了:
5.3條件語(yǔ)句
- C++語(yǔ)言提供了兩種按條件執(zhí)行的語(yǔ)句。一種是if語(yǔ)句,它根據(jù)條件決定控制流;另外一種是switch語(yǔ)句,它計(jì)算一個(gè)整型表達(dá)式的值,然后根據(jù)這個(gè)值從幾條執(zhí)行路徑中選擇一條。
5.3.1 if語(yǔ)句
- if語(yǔ)句(ifstatement)的作用是:判斷一個(gè)指定的條件是否為真,根據(jù)判斷結(jié)果決定是否執(zhí)行另外一條語(yǔ)句。if語(yǔ)句包括兩種形式:一種含有else分支,另外一種沒(méi)有。簡(jiǎn)單if語(yǔ)句的語(yǔ)法形式是
- 在這兩個(gè)版本的if語(yǔ)句中,condition都必須用圓括號(hào)包圍起來(lái)。condition可以是一個(gè)表達(dá)式,也可以是一個(gè)初始化了的變量聲明(參見(jiàn)5.2節(jié),第155頁(yè))。不管是表達(dá)式還是變量,其類型都必須能轉(zhuǎn)換成(參見(jiàn)4.11節(jié),第141頁(yè))布爾類型。通常情況下,statement和statement2是塊語(yǔ)句。
- 如果condition為真,執(zhí)行statemento當(dāng)statement執(zhí)行完成后,程序繼續(xù)執(zhí)行if語(yǔ)句后面的其他語(yǔ)句。
- 如果condition為假,跳過(guò)statemento對(duì)于簡(jiǎn)單if語(yǔ)句來(lái)說(shuō),程序繼續(xù)執(zhí)行if語(yǔ)句后面的其他語(yǔ)句;對(duì)于ifelse語(yǔ)句來(lái)說(shuō),執(zhí)行statement2
使用 if else語(yǔ)句
- 我們舉個(gè)例子來(lái)說(shuō)明if語(yǔ)句的功能,程序的目的是把數(shù)字形式表示的成績(jī)轉(zhuǎn)換成字母形式。假設(shè)數(shù)字成績(jī)的范圍是從0到100(包括100在內(nèi)),其中100分對(duì)應(yīng)的字母形式是"A++”,低于60分的成績(jī)對(duì)應(yīng)的字母形式是“F”。其他成績(jī)每10個(gè)劃分成一組;60到69(包括69在內(nèi))對(duì)應(yīng)字母"D”、70到79對(duì)應(yīng)字母"C”,以此類推。使用vector對(duì)象存放字母成績(jī)所有可能的取值:
- 判斷grade的值是否小于60,根據(jù)結(jié)果選擇執(zhí)行if分支還是else分支。在else分支中,由成績(jī)計(jì)算得到一個(gè)下標(biāo),具體過(guò)程是:首先從grade中減去50,然后執(zhí)行整數(shù)除法(參見(jiàn)4.2節(jié),在125頁(yè)),去掉余數(shù)后所得的商就是數(shù)組scores對(duì)應(yīng)的下標(biāo)。
懸垂else
- 當(dāng)一個(gè)if語(yǔ)句嵌套在另一個(gè)if語(yǔ)句內(nèi)部時(shí),很可能if分支會(huì)多于else分支。事實(shí)上,之前那個(gè)成績(jī)轉(zhuǎn)換的程序就有4個(gè)if分支,而只有2個(gè)else分支。這時(shí)候問(wèn)題出現(xiàn)了:我們?cè)趺粗滥硞€(gè)給定的else是和哪個(gè)if匹配呢?
- 這個(gè)問(wèn)題通常稱作懸垂else(danglingelse),在那些既有if語(yǔ)句又有ifelse語(yǔ)句的編程語(yǔ)言中是個(gè)普遍存在的問(wèn)題。不同語(yǔ)言解決該問(wèn)題的思路也不同,就C而言,它規(guī)定else與離它最近的尚未匹配的if匹配,從而消除了程序的二義性。當(dāng)代碼中if分支多于else分支時(shí),程序員有時(shí)會(huì)感覺(jué)比較麻煩。舉個(gè)例子來(lái)說(shuō)明,對(duì)于添加加號(hào)減號(hào)的那個(gè)最內(nèi)層的ifelse語(yǔ)句,我們用另外一組條件改寫它:
5.3.2switch語(yǔ)句
- switch語(yǔ)句(switchstatement)提供了一條便利的途徑使得我們能夠在若干固定選項(xiàng)中做出選擇。舉個(gè)例子,假如我們想統(tǒng)計(jì)五個(gè)元音字母在文本中出現(xiàn)的次數(shù),程序邏輯應(yīng)該如下所示:
- 從輸入的內(nèi)容中讀取所有字符。令每一個(gè)字符都與元音字母的集合比較。如果字符與某個(gè)元音字母匹配,將該字母的數(shù)量加1。顯示結(jié)果。
- 要想實(shí)現(xiàn)這項(xiàng)功能,直接使用switch語(yǔ)句即可:
- switch語(yǔ)句首先對(duì)括號(hào)里的表達(dá)式求值,該表達(dá)式緊跟在關(guān)鍵字switch的后面,可以是一個(gè)初始化的變量聲明(參見(jiàn)5.2節(jié),第155頁(yè))。表達(dá)式的值轉(zhuǎn)換成整數(shù)類型,然后與每個(gè)case標(biāo)簽的值比較。如果表達(dá)式和某個(gè)case標(biāo)簽的值匹配成功,程序從該標(biāo)簽之后的第一條語(yǔ)句開(kāi)始執(zhí)行,直到到達(dá)了switch的結(jié)尾或者是遇到一條break語(yǔ)句為止。我們將在5.5.1節(jié)(第170頁(yè))詳細(xì)介紹break語(yǔ)句,簡(jiǎn)言之,break語(yǔ)句的作用是中斷當(dāng)前的控制流。此例中,break語(yǔ)句將控制權(quán)轉(zhuǎn)移到switch語(yǔ)句外面。因?yàn)閟witch是while循環(huán)體內(nèi)唯一的語(yǔ)句,所以從switch語(yǔ)句中斷出來(lái)以后,程序的控制權(quán)將移到while語(yǔ)句的右花括號(hào)處。此時(shí)while語(yǔ)句內(nèi)部沒(méi)有其他語(yǔ)句要執(zhí)行,所以while會(huì)返回去再一次判斷條件是否滿足。
- 如果switch語(yǔ)句的表達(dá)式和所有case都沒(méi)有匹配上,將直接跳轉(zhuǎn)到switch結(jié)構(gòu)之后的第一條語(yǔ)句。剛剛說(shuō)過(guò),在上面的例子中,退出switch后控制權(quán)回到while語(yǔ)句的條件部分。case關(guān)鍵字和它對(duì)應(yīng)的值一起被稱為case標(biāo)簽(caselabel)。case標(biāo)簽必須是整型常量表達(dá)式(參見(jiàn)2.4.4節(jié),第58頁(yè)):
switch內(nèi)部的控制流
- 理解程序在case標(biāo)簽之間的執(zhí)行流程非常重要。如果某個(gè)case標(biāo)簽匹配成功,將從該標(biāo)簽開(kāi)始往后順序執(zhí)行所有case分支,除非程序顯式地中斷了這一過(guò)程,否則直到switch的結(jié)尾處才會(huì)停下來(lái)。要想避免執(zhí)行后續(xù)case分支的代碼,我們必須顯式地告訴編譯器終止執(zhí)行過(guò)程。大多數(shù)情況下,在下一個(gè)case標(biāo)簽之前應(yīng)該有一條break語(yǔ)句。
- 然而,也有一些時(shí)候默認(rèn)的switch行為才是程序真正需要的。每個(gè)case標(biāo)簽只能對(duì)應(yīng)一個(gè)值,但是有時(shí)候我們希望兩個(gè)或更多個(gè)值共享同一組操作。此時(shí),我們就故意省略掉break語(yǔ)句,使得程序能夠連續(xù)執(zhí)行若干個(gè)case標(biāo)簽。例如,也許我們想統(tǒng)計(jì)的是所有元音字母出現(xiàn)的總次數(shù):
- 在上面的代碼中,幾個(gè)case標(biāo)簽連寫在一起,中間沒(méi)有break語(yǔ)句。因此只要ch是元 音字母,不管到底是五個(gè)中的哪一個(gè)都執(zhí)行相同的代碼。
- C++程序的形式比較自由,所以case標(biāo)簽之后不一定非得換行。把幾個(gè)case標(biāo)簽寫在一行里,強(qiáng)調(diào)這些case代表的是某個(gè)范圍內(nèi)的值:
default標(biāo)簽
- 如果沒(méi)有任何一個(gè)case標(biāo)簽?zāi)芷ヅ渖蟬witch表達(dá)式的值,程序?qū)?zhí)行緊跟在default標(biāo)簽(defaultlabel)后面的語(yǔ)句。例如,可以增加一個(gè)計(jì)數(shù)值來(lái)統(tǒng)計(jì)非元音字母的數(shù)量,只要在default分支內(nèi)不斷遞增名為otherCnt的變量就可以了:
switch內(nèi)部的變量定義
- 如前所述,switch的執(zhí)行流程有可能會(huì)跨過(guò)某些case標(biāo)簽。如果程序跳轉(zhuǎn)到了某個(gè)特定的case,則switch結(jié)構(gòu)中該case標(biāo)簽之前的部分會(huì)被忽略掉。這種忽略掉一部分代碼的行為引出了一個(gè)有趣的問(wèn)題:如果被略過(guò)的代碼中含有變量的定義該怎么辦?
- 答案是:如果在某處一個(gè)帶有初值的變量位于作用域之外,在另一處該變量位于作用域之內(nèi),則從前一處跳轉(zhuǎn)到后一處的行為是非法行為。
- 假設(shè)上述代碼合法,則一旦控制流直接跳到false分支,也就同時(shí)略過(guò)了變量filename和ival的初始化過(guò)程。此時(shí)這兩個(gè)變量位于作用域之內(nèi),跟在false之后的代碼試圖在尚未初始化的情況下使用它們,這顯然是行不通的。因此C++語(yǔ)言規(guī)定,不允許跨過(guò)變量的初始化語(yǔ)句直接跳轉(zhuǎn)到該變量作用域內(nèi)的另一個(gè)位置。
- 如果需要為某個(gè)case分支定義并初始化一個(gè)變量,我們應(yīng)該把變量定義在塊內(nèi),從而確保后面的所有case標(biāo)簽都在變量的作用域之外。
?
5 . 4 迭代語(yǔ)句
- 迭代語(yǔ)句通常稱為循環(huán),它重復(fù)執(zhí)行操作直到滿足某個(gè)條件才停下來(lái)。while和 for 語(yǔ)句在執(zhí)行循環(huán)體之前檢查條件,do while語(yǔ)句先執(zhí)行循環(huán)體,然后再檢查條件。
- 定義在while條件部分或者while循環(huán)體內(nèi)的變量每次迭代都經(jīng)歷從創(chuàng)建到銷毀的過(guò)程。
- while循環(huán)結(jié)束之后 循環(huán)控制變量仍然可以使用
- 第一個(gè)循環(huán)從標(biāo)準(zhǔn)輸入中讀取數(shù)據(jù),我們一開(kāi)始不清楚循環(huán)要執(zhí)行多少次,當(dāng)cin讀取到無(wú)效數(shù)據(jù)、遇到其他一些輸入錯(cuò)誤或是到達(dá)文件末尾時(shí)循環(huán)條件失效。第二個(gè)循環(huán)重復(fù)執(zhí)行直到遇到一個(gè)負(fù)值為止,循環(huán)終止后,beg或者等于v.end(),或者指向v中一個(gè)小于0的元素。可以在while循環(huán)外繼續(xù)使用beg的狀態(tài)以進(jìn)行其他處理。
傳統(tǒng)for循環(huán)的執(zhí)行流程
- 我們以3.2.3節(jié) (第 85頁(yè) )的 for循環(huán)為例:
- 求值的順序如下所示:
- 1循環(huán)開(kāi)始時(shí),首先執(zhí)行一次init-statement此例中,定義index并初始化為0。
- 2.接下來(lái)判斷condition.如果index不等于s.size()而且在s[index]位置的字符不是空白,則執(zhí)行for循環(huán)體的內(nèi)容。否則,循環(huán)終止。如果第一次迭代時(shí)條件就為假,for循環(huán)體一次也不會(huì)執(zhí)行。
- 3.如果條件為真,執(zhí)行循環(huán)體。此例中,for循環(huán)體將s[index]位置的字符改寫成大寫形式。
- 4.最后執(zhí)行express。此例中,將index的值加1。這4步說(shuō)明了for循環(huán)第一次迭代的過(guò)程。其中第1步只在循環(huán)開(kāi)始時(shí)執(zhí)行一次,第2、3、4步重復(fù)執(zhí)行直到條件為假時(shí)終止,也就是在s中遇到一個(gè)空白字符或者index大于s.size()時(shí)終止。
- 牢記for語(yǔ)句頭中定義的對(duì)象只在for循環(huán)體內(nèi)可見(jiàn)。因此在上面的例子中,for循環(huán)結(jié)束后index就不可用了。
省略for語(yǔ)句頭的某些部分
- for語(yǔ)句頭能省略掉init-statement condition和expression中的任何一個(gè)(或者全部)。如果無(wú)須初始化,則我們可以使用一條空語(yǔ)句作為init-statement.例如,對(duì)于在vector對(duì)象中尋找第一個(gè)負(fù)數(shù)的程序,完全能用for循環(huán)改寫:
- 注意,分號(hào)必須保留以表明我們省略掉了init-statementc說(shuō)得更準(zhǔn)確一點(diǎn),分號(hào)表示的是一個(gè)空的init-statement。在這個(gè)循環(huán)中,因?yàn)樗幸龅墓ぷ鞫荚趂or語(yǔ)句頭的條件和表達(dá)式部分完成了,所以for循環(huán)體也是空的。其中,條件部分決定何時(shí)停止查找,表達(dá)式部分遞增迭代器。
- 省略condition的效果等價(jià)于在條件部分寫了一個(gè)true。因?yàn)闂l件的值永遠(yuǎn)是true,所以在循環(huán)體內(nèi)必須有語(yǔ)句負(fù)責(zé)退出循環(huán),否則循環(huán)就會(huì)無(wú)休止地執(zhí)行下去:
- 我們也能省略掉for語(yǔ)句頭中的expresssion,但是在這樣的循環(huán)中就要求條件部分或者循環(huán)體必須改變迭代變量的值。舉個(gè)例子,之前有一個(gè)將整數(shù)讀入vector的while循環(huán),我們使用for語(yǔ)句改寫它:
- 因?yàn)闂l件部分能改變i 的值,所以這個(gè)循環(huán)無(wú)須表達(dá)式部分。其中,條件部分不斷檢查輸入流的內(nèi)容,只要讀取完所有的輸入或者遇到一個(gè)輸入錯(cuò)誤就終止循環(huán)。
- 因?yàn)閷?duì)于do-while來(lái)說(shuō)先執(zhí)行語(yǔ)句或者塊,后判斷條件,所以不允許在條件部分定義變量:
5.5跳轉(zhuǎn)語(yǔ)句
- 跳轉(zhuǎn)語(yǔ)句中斷當(dāng)前的執(zhí)行過(guò)程。C++語(yǔ)言提供了4種跳轉(zhuǎn)語(yǔ)句:break、continue,goto和returno本章介紹前三種跳轉(zhuǎn)語(yǔ)句,return語(yǔ)句將在6.3節(jié)(第199頁(yè))進(jìn)行介紹。
- 標(biāo)記為#1的break語(yǔ)句負(fù)責(zé)終止連字符case標(biāo)簽后面的for循環(huán)。它不但不會(huì)終止switch語(yǔ)句,甚至連當(dāng)前的case分支也終止不了。接下來(lái),程序繼續(xù)執(zhí)行for循環(huán)之后的第一條語(yǔ)句,這條語(yǔ)句可能接著處理連字符的情況,也可能是另一條用于終止當(dāng)前分支的break語(yǔ)句。標(biāo)記為#2的break語(yǔ)句負(fù)責(zé)終止switch語(yǔ)句,但是不能終止while循環(huán)。執(zhí)行完這個(gè)break后,程序繼續(xù)執(zhí)行while的條件部分
5.6 try語(yǔ)句塊和異常處理
- 異常是指存在于運(yùn)行時(shí)的反常行為,這些行為超出了函數(shù)正常功能的范圍。典型的異常包括失去數(shù)據(jù)庫(kù)連接以及遇到意外輸入等。處理反常行為可能是設(shè)計(jì)所有系統(tǒng)最難的一部分。
- 當(dāng)程序的某部分檢測(cè)到一個(gè)它無(wú)法處理的問(wèn)題時(shí),需要用到異常處理。此時(shí),檢測(cè)出問(wèn)題的部分應(yīng)該發(fā)出某種信號(hào)以表明程序遇到了故障,無(wú)法繼續(xù)下去了,而且信號(hào)的發(fā)出方無(wú)須知道故障將在何處得到解決。一旦發(fā)出異常信號(hào),檢測(cè)出問(wèn)題的部分也就完成了任務(wù)。
- 如果程序中含有可能引發(fā)異常的代碼,那么通常也會(huì)有專門的代碼處理問(wèn)題。例如,如果程序的問(wèn)題是輸入無(wú)效,則異常處理部分可能會(huì)要求用戶重新輸入正確的數(shù)據(jù);如果丟失了數(shù)據(jù)庫(kù)連接,會(huì)發(fā)出報(bào)警信息。
- 異常處理機(jī)制為程序中異常檢測(cè)和異常處理這兩部分的協(xié)作提供支持。在C++語(yǔ)言中,異常處理包括:
5.6.1throw表達(dá)式
- 程序的異常檢測(cè)部分使用throw表達(dá)式引發(fā)一個(gè)異常。throw表達(dá)式包含關(guān)鍵字throw和緊隨其后的一個(gè)表達(dá)式,其中表達(dá)式的類型就是拋出的異常類型。throw表達(dá)式后面通常緊跟一個(gè)分號(hào),從而構(gòu)成一條表達(dá)式語(yǔ)句。
- 舉個(gè)簡(jiǎn)單的例子,回憶1.5.2節(jié)(第20頁(yè))把兩個(gè)Sales_item對(duì)象相加的程序。這個(gè)程序檢查它讀入的記錄是否是關(guān)于同一種書籍的,如果不是,輸出一條信息然后退出。
- try語(yǔ)句塊的一開(kāi)始是關(guān)鍵字try,隨后緊跟著一個(gè)塊,這個(gè)塊就像大多數(shù)時(shí)候那樣是花括號(hào)括起來(lái)的語(yǔ)句序列。
- 跟在try塊之后的是一個(gè)或多個(gè)catch子句。catch子句包括三部分:關(guān)鍵字catch、括號(hào)內(nèi)一個(gè)(可能未命名的)對(duì)象的聲明(稱作異常聲明,exceptiondeclaration)以及一個(gè)塊。當(dāng)選中了某個(gè)catch子句處理異常之后,執(zhí)行與之對(duì)應(yīng)的塊。catch-旦完成,程序跳轉(zhuǎn)到try語(yǔ)句塊最后一個(gè)catch子句之后的那條語(yǔ)句繼續(xù)執(zhí)行。try語(yǔ)句塊中的program-statements組成程序的正常邏輯,像其他任何塊一樣,program-statements可以有包括聲明在內(nèi)的任意C++語(yǔ)句。一如往常,try語(yǔ)句塊內(nèi)聲明的變量在塊外部無(wú)法訪問(wèn),特別是在catch子句內(nèi)也無(wú)法訪問(wèn)。
- 程序本來(lái)要執(zhí)行的任務(wù)出現(xiàn)在try語(yǔ)句塊中,這是因?yàn)檫@段代碼可能會(huì)拋出一個(gè)runtime_error類型的異常。try語(yǔ)句塊對(duì)應(yīng)catch子句,該子句負(fù)責(zé)處理類型為runtime_error的異常。
- 如果try語(yǔ)句塊的代碼拋出了runtime_error異常,接下來(lái)執(zhí)行catch塊內(nèi)的語(yǔ)句。在我們書寫的catch子句中,輸出一段提示信息要求用戶指定程序是否繼續(xù)。如果用戶輸入,n,,執(zhí)行break語(yǔ)句并退出while循環(huán);否則,直接執(zhí)行while循環(huán)的右側(cè)花括號(hào),意味著程序控制權(quán)跳回到while條件部分準(zhǔn)備下一次迭代。給用戶的提示信息中輸出了err.what()的返回值。我們知道err的類型是runtime_error,因此能推斷what是runtime_error類的一個(gè)成員函數(shù)(參見(jiàn)1.5.2節(jié),第20頁(yè))。每個(gè)標(biāo)準(zhǔn)庫(kù)異常類都定義了名為what的成員函數(shù),這些函數(shù)沒(méi)有參數(shù),返回值是C風(fēng)格字符串(即const char*),其中,runtime_error的what成員返回的是初始化一個(gè)具體對(duì)象時(shí)所用的string對(duì)象的副本。如果上一節(jié)編寫的代碼拋出異常,則本節(jié)的catch子句輸出
- throw 拋出錯(cuò)誤信息和錯(cuò)誤對(duì)象綁定;try捕捉錯(cuò)誤信息;catch處理,輸出之前throw中 錯(cuò)誤信息和錯(cuò)誤對(duì)象綁定的結(jié)果
5.6.3標(biāo)準(zhǔn)異常
- C++標(biāo)準(zhǔn)庫(kù)定義了一組類,用于報(bào)告標(biāo)準(zhǔn)庫(kù)函數(shù)遇到的問(wèn)題。這些異常類也可以在用戶編寫的程序中使用,它們分別定義在4個(gè)頭文件中:
- exception頭文件定義了最通用的異常類exception。它只報(bào)告異常的發(fā)生,不提供任何額外信息。
- stdexcept頭文件定義了幾種常用的異常類,詳細(xì)信息在表5.1中列出。
- new頭文件定義了bad_alloc異常類型,這種類型將在12.1.2節(jié)(第407頁(yè))詳細(xì)介紹。
- type_info頭文件定義了bad_cast異常類型,這種類型將在19.2節(jié)(第731頁(yè))詳細(xì)介紹
- what函數(shù)返回的C風(fēng)格字符串的內(nèi)容與異常對(duì)象的類型有關(guān)。如果異常類型有一個(gè)字符串初始值,則what返回該字符串。對(duì)于其他無(wú)初始值的異常類型來(lái)說(shuō),what返回的內(nèi)容由編譯器決定。
小結(jié)
- C++語(yǔ)言僅提供了有限的語(yǔ)句類型,它們中的大多數(shù)會(huì)影響程序的控制流程:
- while、for和dowhile語(yǔ)句,執(zhí)行迭代操作。
- if和switch語(yǔ)句,提供條件分支結(jié)構(gòu)。
- continue語(yǔ)句,終止循環(huán)的當(dāng)前一次迭代。
- break語(yǔ)句,退出循環(huán)或者switch語(yǔ)句。
- goto語(yǔ)句,將控制權(quán)轉(zhuǎn)移到一條帶標(biāo)簽的語(yǔ)句。
- try和catch,將一段可能拋出異常的語(yǔ)句序列括在花括號(hào)里構(gòu)成try語(yǔ)句塊。catch子句負(fù)責(zé)處理代碼拋出的異常。
- throw表達(dá)式語(yǔ)句,存在于代碼塊中,將控制權(quán)轉(zhuǎn)移到相關(guān)的catch子句。
- return語(yǔ)句,終止函數(shù)的執(zhí)行。我們將在第6登介紹return語(yǔ)句。除此之外還有表達(dá)式語(yǔ)句和聲明語(yǔ)句。表達(dá)式語(yǔ)句用于求解表達(dá)式,關(guān)于變量的聲明和定義在第2章已經(jīng)介紹過(guò)了。
詞匯
- 復(fù)合語(yǔ)句(compound statement)和塊是同義詞。
- 異常處理代碼(exception handler)程序某處引發(fā)異常后,用于處理該異常的另一處代碼。和 catch子句是同義詞。
- 異常安全(exception safe) 是一-個(gè)術(shù)語(yǔ),表示的含義是當(dāng)拋出異常后,程序能執(zhí)行正確的行為。
- 表達(dá)式語(yǔ)句(expression statement)即一條表達(dá)式后面跟上一個(gè)分號(hào),令表達(dá)式執(zhí)行求值過(guò)程。
- 控制流(flow of control) 程序的執(zhí)行路徑?
- 帶標(biāo)簽語(yǔ)句(labeled statement)前面帶有標(biāo)簽的語(yǔ)句。所謂標(biāo)簽是指一個(gè)標(biāo)識(shí)符以及緊跟著的一個(gè)冒號(hào)。對(duì)于同一個(gè)標(biāo)識(shí)符來(lái)說(shuō),用作標(biāo)簽的同時(shí)還能用于其他目的,互不干擾。
- 空 語(yǔ) 句 (null statement)只含有一個(gè)分號(hào)的語(yǔ)句
- 引 發(fā) (raise)含義類似于throw。在 C++語(yǔ)言中既可以說(shuō)拋出異常,也可以說(shuō)引發(fā)異常。
- 范圍 for 語(yǔ) 句 (range for statement)在一個(gè)序列中進(jìn)行迭代的語(yǔ)句。
- terminate是一個(gè)標(biāo)準(zhǔn)庫(kù)函數(shù),當(dāng)異常沒(méi)有 被捕捉到時(shí)調(diào)用。terminate終止當(dāng)前程序的執(zhí)行。
總結(jié)
以上是生活随笔為你收集整理的C++primer 第 5 章语句 5.2语句作用域 5.3条件语句 5 . 4 迭代语句 5.5跳转语句 5.6 try语句块和异常处理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 东软 软件工程3 软件项目管理 团队组织
- 下一篇: C++ Vecctor容器浅析