- #1.簡單語句
- #2.語句作用域
-
#3.條件語句
- 3.1 if語句
- 3.2 switch語句
-
#4.迭代語句
- 4.1 while語句
- 4.2 傳統的for語句
- 4.3 范圍for語句
- 4.4 do while語句
-
#5.跳轉語句
- 5.1 break語句
- 5.2 continue語句
- 5.3 goto語句
-
#6.TRY語句塊和異常處理
- 6.1 throw表達式
- 6.2 try語句塊
- 6.3 標準異常
#1. 簡單語句
C++語言中大多數語句都以分號結束,一個表達式,末尾加上分號就變成了表達式語句。
空語句
最簡單的語句就是空語句,空語句中只含有一個單獨的分號:
; //空語句
別漏寫分號,也別多寫分號
因為空語句是一條語句,所以可以用在任何允許使用語句的地方。
int v1 = 1,v2 = 2,ival;
ival = v1 + v2;; //正確:第二個分號表示一條多余的空語句
復合語句(塊)
復合語句是指用花括號括起來的語句和聲明的序列,復合語句也被稱為塊。
#2. 語句作用域
可以在if、switch、while和for語句的控制結構中定義變量。定義在控制結構當中的變量只在相應的語句的內部可見,一旦語句結束,變量也就超出其作用范圍了:
while(int i = get_num()) { //每次迭代時創建并初始化i
cout << i << endl;
}
i = 0; //錯誤:在循環體外部無法訪問i
#3. 條件語句
C++語言提供了兩種按條件執行的語句。一種是if語句,它根據條件決定控制流;另外一種是switch語句,它計算一個整形表達式的值,然后根據這個值從幾條執行路徑中選擇一條。
3.1 if語句
if語句的作用是:判斷一個指定的條件是否為真,根據判斷的結果決定是否執行另外一條語句。if語句包括兩種形式:一種含有else分支,另外一種沒有。簡單if語句的語法形式是:
if(condition)
statement
if else語句的形式是:
if(condition)
statement
else
statement2
3.2 switch語句
switch語句提供了一條便利的途徑使得我們能夠在若干固定選項中做出選擇。
#4. 迭代語句
迭代語句通常稱為循環,它重復執行操作直到滿足某個條件才停下來。while和for語句在執行循環體前檢查條件,do while語句先執行循環體,然后再檢查條件。
4.1 while語句
只要條件為真,while語句就重復地執行循環體,它的語法形式是:
while(condition)
statement
==定義在while條件部分或者while循環體內的變量每次迭代都經歷從創建到銷毀的過程。==
使用while循環
當不確定到底迭代多少次時,使用while循環比較合適。
vector<int> v;
int i;
//重復讀入數據,直至到達文件末尾或者遇到其他輸入問題
while(cin >> i) {
v.push_back(i);
}
auto beg = v.begin();
while(beg != v.end() && *beg >= 0) {
++beg;
}
if(beg == v.end) {
...
}
4.2 傳統的for語句
for語句的語法形式:
for(init-statement;condition;expression) {
statement;
}
傳統for循環的執行流程
以下面的for循環為例:
for(decltype(s.size()) index = 0;index != s.size() && !isspace(index);++index) {
s[index] = toupper(s[index]); //將當前的字符改成大寫形式
}
求值的順序如下所示:
- 循環開始,首先執行一次init-statement。此例中,定義index并初始化為0。
- 接下來判斷condition。如果index不等于s.size()而且在s[index]位置的字符不是空白,則執行for循環體的內容。否則,循環終止。如果第一次迭代時條件為假,for循環體一次也不會執行。
- 如果條件為真,執行循環體。此例中將s[index]位置的字符改寫成大寫形式。
- 最后執行expression。此例中,將index的值加1。
4.3 范圍for語句
C++11新標準引入了一種更簡單的for語句,這種語句可以遍歷容器或其他序列的所有元素。范圍for語句的語法形式是:
for(declaration:expression)
statement
expression表示的必須是一個序列,比如用花括號括起來的初始值列表、數組或者vector或string等類型的對象,這些類型的共同特點是能返回迭代器的begin和end成員。
declaration定義一個變量,序列中的每個元素都得能轉換成該變量的類型。確保類型相容最簡單的辦法是使用auto類型說明符。
vector<int> ivec = {0,1,2,3,4,5};
for(auto &r : ivec) {
r *= 2; //對于ivec中的每一個元素
}
4.4 do-while語句
do-while語句和while語句非常相似,唯一的區別是,do-while語句先執行循環體后檢查條件。不管條件的值如何,都至少執行一次循環。do-while語句的語法形式如下所示:
do
statement
while(condition);
#5. 跳轉語句
跳轉語句中斷當前執行的過程。C++語言提供了4種跳轉語句:break、continue、goto和return。
5.1 break語句
break語句負責終止離它最近的while、do-while、for或switch語句,并從這些語句之后的第一條語句開始繼續執行。
5.2 continue語句
continue語句終止最近的循環中的當前迭代并立即開始下一次迭代。continue語句只能出現在for、while和do-while循環的內部,或者嵌套在此類循環里的語句或塊的內部。
string buf;
while(cin >> buf && !buf.empty()) {
if(buf[0] != '_')
continue; //接著讀取下一個輸入
}
5.3 goto語句
goto語句的作用是從goto語句無條件跳轉到同一函數內的另一條語句。goto語句的語法形式:
goto label;
其中,label是用于標識一條語句的標示符。帶標簽語句是一種特殊的語句,在它之前有一個標示符以及一個冒號:
end:return; //帶標簽語句,可以作為goto的目標
#6. try語句塊和異常處理
異常是指存在于運行時的反常行為,這些行為超出了函數正常功能的范圍。異常處理機制為程序中異常檢測和異常處理這兩部分的協作提供支持。在C++語言中,異常處理包括:
- throw表達式,異常檢測部分使用throw表達式來表示它遇到了無法處理的問題。即throw引發了異常。
- try語句塊,異常處理部分使用try語句塊處理異常。try語句塊以關鍵字try開始,并以一個或多個catch字句結束。try語句塊中代碼拋出的異常通常會被某個catch字句處理。因此catch字句處理異常,所以它們也被稱作異常處理代碼。
- 一套異常類,用于在throw表達式和相關的catch字句之間傳遞異常的具體信息。
6.1 throw表達式
程序的異常檢測部分使用throw表達式引發一個異常。
if (item.isbn() != item2.isbn()) {
throw runtime_error("Data must refer to same ISBN");
}
6.2 try語句塊
try語句塊的通用語法形式是:
try{
//program-statements
}catch(exception-declaration){
//handler-statements
}catch(exception-declaration){
//handler-statements
}
6.3 標準異常
C++標準庫定義了一組類,用于報告標準庫函數遇到的問題。這些異常類也可以在用戶編寫的程序中使用,它們分別定義在4個頭文件中:
- exception頭文件定義了最通用的異常類exception。它只報告異常的發生,不提供任何額外的信息。
- stdexcept頭文件定義了幾種常用的異常類。
- new頭文件定義了bad_alloc異常類型。
- type_info頭文件定義了bad_cast異常類型。