1. 程式人生 > >C++Primer——《第五章 》語句

C++Primer——《第五章 》語句

● 一個表示式,比如 ival+5, 末尾加上分號就變成了表示式語句。表示式語句的作用是執行表示式並丟棄掉求值結果。

● 空語句中只含有一個單獨的分號:

如果在程式的某個地方,語法上需要一條語句但是邏輯上不需要,此時應該使用空語句。當迴圈的全部工作在條件部分就可以完成時,我們通常會用到空語句

注意:使用空語句時應該加上註釋,從而令讀這段程式碼的人知道該語句是有意省略的。

注意:多餘的空語句並非總是無害的。


● 如果在程式的某個地方,語法是需要一條語句,但是邏輯上需要多條語句,則應該使用複合語句。 例如,while 或者 for 的迴圈體必須是一條語句,但是我們常常需要在迴圈體內做很多事情, 此時就需要將多條語句用花括號括起來,從而把語句序列轉變成塊。

● 注意: 所謂空塊,是指內部沒有任何語句的一對花括號。空塊的作用等價於空語句:

while(cin>>s && s!=sought)
{

}

● 注意: 如果其他程式碼也需要訪問迴圈控制變數,則該變數必須定義(宣告)在語句的外部。 因為控制結構定義的物件的值馬上要由結構本身使用, 所以這些變數必須初始化。


● 我們怎麼知道某個給定的else 是和哪個if匹配呢? 這個問題通常稱作 懸垂 else,C++規定else與離它最近的尚未匹配的if匹配,從而消除了程式的二義性。

● 注意 : 即使不準備在 default 標籤下做任何工作, 定義一個default標籤也是有用的 。 其目的在於告訴程式的讀者, 我們已經考慮到了預設的情況, 只是目前什麼也沒做。

那麼標籤不應該孤零零的出現, 它後面必須跟上一條語句或者另外一個case標籤。如果 switch結構以一個空的default 標籤作為結束, 則該default 標籤後面必須跟上一條空語句或一個空塊。
 


while 語句


● while 的條件部分可以是一個表示式或者是一個帶初始化的變數宣告。通常來說,應該由條件本身或者是迴圈體設法改變表示式的值,否則迴圈可能無法終止。

while(int i = get_num ())

注意 : 定義在while 條件部分或者 while 迴圈體內的變數每次迭代都經歷從建立到銷燬的過程。

● 當不確定到底要迭代多少次時,使用 while 迴圈比較合適,比如讀取輸入的內容就是如此。 還有一種情況也應該使用while迴圈 , 這就是我們想在迴圈結束後 訪問迴圈控制變數。


 


for語句中的多重定義


● 和其他宣告一樣, for語句中的 init-statement 也可以定義多個物件。 但是init-statement 只能有一條宣告語句, 因此, 所有變數的基礎型別必須相同。

       string v = "huang";
	//該迴圈是把string的元素拷貝一份到原來的元素後面
	for (decltype(v.size()) i = 0, sz = v.size(); i != sz; ++i)
	{
		v.push_back(v[i]);
	}
	for (auto tt = v.begin(); tt != v.end(); ++tt)
	{
		cout << *tt;
	}
	for (auto tt : v)  //等價的迴圈
	{
		cout << tt;
	}

範圍for語句


● for 語句 可以遍歷容器或其他序列的所有元素, 範圍 for 語句 的語法形式是 :

for (declaration : expression)
{
   statement ;
}

expression 表示的必須是一個序列, 比如用花括號括起來的初始值列表、陣列、 或者 vector 或 string 等型別的物件, 這些型別的共同特點是擁有能返回迭代器的begin 和 end 成員。

declaration 定義一個變數, 序列中的每個元素都能轉換成該變數的型別。 確保型別相容最簡單的辦法是使用 auto 型別說明符。 這個關鍵字可以令編譯器幫助我們指定合適的型別。

注意: 如果需要對序列中的元素執行寫操作, 迴圈變數必須宣告成引用型別。
 


● 注意: 每次迭代都會重新定義迴圈控制變數,declaration 部分的變數會被初始化為 expression 部分的下一個元素的值(或者說: 並將其初始化序列中的下一個值)。

● 注意 : 不能通過範圍for語句增加vector物件(或者其他容器)的元素了。在範圍for語句中, 預存了 end() 的值。 一旦在序列中新增(刪除) 元素, end() 函式的值就可能會被移動,使而變的無效了。
 


do while 語句


do 
{ 
statement

} while(condition);` // 注意 : condition使用的變數必須定義在外面

注意 : 因為對於 do white 來說先執行語句或者塊, 後判斷條件,所以不允許在條件部分定義變數。


break 語句


● break 語句負責終止離它最近的while、do while 、 for 或 switch語句,並從這些語句之後的第一條語句開始執行

● break 語句只能出現在迭代語句或者switch 語句內部(包括巢狀在此類迴圈裡的語句或塊的內部)。break 語句的作用範圍僅限於最近的迴圈或者switch。

 


continue 語句


 

● continue語句 終止最近的迴圈中的當前迭代並立即開始下一次迭代。 continue 語句只能出現在for、while和do while 迴圈的內部,或者巢狀在此類迴圈裡的語句或塊的內部。

和break 語句類似的是, 出現在巢狀迴圈中continue 語句也僅作用於離它最近的迴圈。

和break 語句不同 的是, 只有當switch 語句巢狀在迭代語句內部時, 才能在switch 裡使用continue

注意: continue 語句中斷當前迭代,但是仍然繼續執行迴圈。 對於範圍for語句來說, 則是用序列中的下一個元素初始化迴圈控制變數。
 


try 語句塊 和 異常處理


 

● 異常是指存在於執行時的反常行為, 這些行為超出了函式正常功能的範圍。 典型的異常包括失去資料庫連線以及遇到意外輸入等。

● 當程式的某部分檢測到一個它無法處理的問題時, 需要用到異常處理。

● 如果程式中含有可能引發異常的程式碼, 那麼通常也會有專門的程式碼處理問題。
這裡寫圖片描述

● 如果程式發生異常情況, 而在當前環境中獲取不到異常處理的足夠資訊,可以將異常丟擲。

● 程式的異常檢測部分使用throw 表示式引發一個異常。throw的語句的語法格式為:

throw 表示式;

注意: 其中表達式的型別就是丟擲的異常型別。 丟擲異常將終止當前的函式, 並把控制權轉移給能處理該異常的程式碼。

● 型別runtime_error 是標準庫異常型別的一種, 定義在stdexcept 標頭檔案中。我們必須初始化runtime——error 的物件, 方式是給它提供一個string物件或者一個C 風格的字串,這個字串中有一些關於異常的輔助資訊。

● throw 作為告知發生異常的語句, 可以出現在任何函式體內。 它與try 和 catch 並沒有對應關係。 只不過在try管轄範圍內的throw 丟擲的異常將被對應的catch捕獲。 根據不同的程式, throw 丟擲的異常也可能沒有被任何的catch 捕獲, 但它卻盡到了自己告知發生異常的義務。

● 注意: 由於catch 是根據資料型別來判斷異常型別的, 所以即使丟擲不同的數值, 只要資料型別相同就會執行同一個異常處理語句塊。