C++ Primer 筆記-第5章 語句

5.1 簡單語句
復(fù)合語句?compound statment?也被稱作塊?block?。塊不以分號作為結(jié)束。
5.3 條件語句
5.3.1?if
?語句
懸垂
else
?(dangling else)?問題:C++規(guī)定?else
?與離他最近的尚未匹配的?if
?匹配,從而消除程序的二義性。
5.3.2?switch
?語句
如果某個?
case
?標(biāo)簽匹配成功,將從該標(biāo)簽開始往后順序執(zhí)行所有?case
?分支,除非程序顯示地終端了這以過程,否則直到?switch
?的結(jié)尾處才會停下來。一般不要省略?
case
?分支最后的?break
?語句。如果沒寫?break
?語句,最好加一段注釋說清楚程序的邏輯。不允許跨過變量的初始值語句直接跳轉(zhuǎn)到該變量作用域的另一個位置。
如果需要為某個?
case
?分支定義并初始化一個變量,應(yīng)該把變量定義在塊內(nèi),從而確保后面的所有?case
?標(biāo)簽都在變量的作用域之外。
5.4 迭代語句
5.4.3 范圍?for
?語句
循環(huán)中預(yù)存了?
end()
?的值。一旦序列中添加(刪除)元素,end()
?的值就可能變的無效。
5.5 跳轉(zhuǎn)語句
5.5.3?goto
?語句
從?
goto
?語句無條件跳轉(zhuǎn)到同一個函數(shù)內(nèi)的另一條語句。不要在程序中使用?
goto
?語句,這會讓程序既難理解又難修改。標(biāo)簽標(biāo)識符可以和程序中其他實體的標(biāo)識符使用同一個名字而不互相干擾。
5.6?try
?語句塊和異常處理
5.6.1?throw
?表達式
程序的異常檢測部分使用?
throw
?表達式引發(fā)一個異常。其中表達式的類型就是拋出的異常類型。
5.6.2?try
?語句塊
throw
?和?try
?示例:

? ?Sales_item item1, item2;
? ?cin >> item1 >> item2;
? ?try
? ?{ ? ?
? ? ? ?????if(item1.isbn() != item2.isbn())
? ? ? ? ? ?????throw runtime_error("Data must refer to same ISBN");
? ? ? ?????cout << item1 + item2 << endl;
? ?}
? ?catch (runtime_error err)
? ?{ ? ?
? ? ? ?????cout << err.what()
? ? ? ? ? ? ????<< "\nTry Again? Enter y or n" << endl;
? ?}
? ?// 如果代碼拋出異常,則 catch 輸出的是:
? ?// Data must refer to same ISBN
? ?// Try Again? Enter y or n

程序拋出異常時,會沿著程序的執(zhí)行路徑逐層回退,直到找到適當(dāng)類型的?
catch
?子句為止。如果最終沒能找到任何匹配的?catch
?子句,程序會轉(zhuǎn)到名為?terminate
?的標(biāo)準庫函數(shù),程序會非正常退出。如果一段程序沒有?
try
?語句塊且發(fā)生了異常。編寫異常安全的代碼非常困難,不在本書的討論范圍內(nèi)。
5.6.3 標(biāo)準異常
異常類型只定義了一個名為?
what()
的成員函數(shù),返回值是一個指向 C 風(fēng)格字符串的?const char*
。該字符串的目的是提供關(guān)于異常的一些文本信息。如果異常類型有一個字符串初始值,則?
what()
?返回該字符串。對于其他無初始值的異常安全類型來說,what()
?返回的內(nèi)容由編譯器決定。

