c++ 基礎語句 簡述
1. 簡單語句
大多數語句都以分號結束,
i+5;
就是表達式語句:
-
作用就是執行並丟棄求值結果
-
只有一個空格的是空語句包含一個分號
ival = v1 + v2;; //第二個分號表示一條多餘的空語句 while(iter != svec.end());//循環體是空語句 ++iter; //不進入循環
1.1 複合語句
用花括號括起來的語句和聲明的序列,塊
-
不以分號結尾
-
表示作用域
-
空塊等價與空語句
1.2 語句作用域
-
如果要訪問作用域外的要訪問控制變量,那必須也定義在作用域外;
但定義在作用域內的對象在作用域結束後好像並沒有刪除
只是不能用此名字訪問了
int *p; { int k = 5; p = &k; } cout << k; //錯誤在作用域外沒有聲明它 cout << *p; //正確指向了作用域內的它,內存沒有消亡一樣可以用
if else 儘量加上花括號,以防代碼混亂不清
-
else 會選擇在最近尚未匹配的if進行匹配 -》 在沒有花括號分開的情況下
if () 1 if () 2 else 3 //3跟2匹配 if () { 1 if () 2 } else 3 //3跟1匹配
-
2 switch 語句
提供多個選擇
switch(ch) { //選擇開始位置往下執行直到break 或者結尾
case 'a':
++cnt;
break;
case 'b':
++cnt;
case 'c':
++cnt;
break;
default: //上面都沒匹配到
cnt = 100;
}
// ch == 'a' or 'c' cnt = 1;
// ch == 'b' cnt == 2;
// ch 都不是 cnt == 100;
- case 標籤必須是整型常量表達式
- 也不能有兩個一樣的標籤
- default 後面必須有個語句或者空塊
2.1 內部變量定義
- 在
switch
中如果case ‘’:定義變量沒有添加花括號也就是在同個switch作用域內是會被定義的 - 但是並不執行初始化,所以只能聲明
- 要初始化必須設置新的作用域
switch(ch) {
case '1': {
int i = 5; //正確 在新的作用域
}
int j;
int k = 5; //錯誤不能初始化
break;
case '3':
i = 3; ///報錯並不在同個作用域內
j = 6; ///正確 都在switch內
cout << j;
default:
{
}
}
- 同樣變量使用也要在變量初始化下面
3. 迭代語句
也叫循環,執行到某個條件才停下來
3.1 while
while (condition) // 不能爲空 真才往下執行
statement //循環體內創建的變量都會經歷創造銷燬
-
只有最後一次循環所聲明的對象內存會被保留,其他次都會被銷燬
證明:
long long ks = 5; long long *p[3]; p[0] = &ks; int t = 1; while (t <= 2) { long long k = t*2; p[t++] = &k; } cout << *p[0] << " "; cout << *p[1] << " "; cout << *p[2] << " "; // 輸出: 5 4 4 表示對象k每次創造都在同一個空間,所以p[1],p[2]指向了同一個對象
3.2 老舊for
老舊版跟往常c語言一樣
for (1 ;2 ; 3){
4
}
1爲首要執行
2 進入循環和每次循環的判斷
3 爲每次結尾的執行
三個內容都可以爲空
4 爲函數體
省略判斷,相當於默認爲true
3.3 範圍for語句
c++11新標準引入的簡單for語句
-
可遍歷容器或序列的所有元素
for (declaration : expression) //expression 必須是一個序列 比如花括號括起來的初始值列表、數組等對象,都能放回迭代器的begin和end成員 statement; declaration 定義一個變量、序列的每個元素都必須能轉換成該變量的類型。auto最好用
- 範圍for中會預存end()值,一旦在循環中添加元素或刪除元素,end函數的值可能變的無效
3.4 do while 語句
和while 相似
- 區別會先執行一次函數體
do {
statement;
}while (condition);
//兩個內容都不能爲空
- condition 不能放入變量聲明
- condition 使用的變量必須聲明在循環體外。
5. 跳轉語句
c++定義了4種跳轉語句 break, continue, goto 和return
5.1 break
- 負責結束離它最近的循環語句或者switch語句
5.2 continue
-
終止本次迭代,並立即開始下一次迭代
-
只能出現在迭代語句內部中
5.3 goto
不要在程序中使用goto語句會把程序變得難以理解和修改
所以我們稍微認識一下就行
- 無條件跳轉到同一個函數內的另一個條語句‘
goto label;
end: return;//作爲goto的目標
和switch類似
//,,,,
goto end;
int ix = 10; //錯誤goto語句繞過了一個帶初始化的變量定義
end:
錯誤 ix的聲明被繞過了
ix = 42;
begin:
int sz = 4; // 合法
6. try 語句塊和異常處理
異常是指存在於運行時的反常行爲,這些行爲超出函數正常功能的範圍。
例如:丟失數據庫連接,意外輸入等,處理反常可能是設計所有系統最難的一部分。
當程序的部分檢測到一個它無法處理的問題時,需要用到異常處理。此時,檢測出問題的部分應該發出某種信號表示遇到故障。
-
信號發出方無須知道故障將在何處解決,
-
檢測出問題的部分也就完成了任務
-
thorw
表達式(throw expression), 異常檢測部分使用throw 表達式來表示他遇到的問題,throw引發了異常- 一套異常類(exception class),用於在throw表達式和有關的catch子句之間傳遞異常的信息
-
try
語句塊(try block), 異常處理部分使用try語句塊處理異常。try語句塊的關鍵字try開始,並以一個或者多個catch子句結束。- 語句塊中代碼拋出的異常通常會被某個catch子句處理,
- catch子句“處理”異常,所以叫異常處理代碼
6.1 throw 表達式
程序的異常檢測部分使用 throw 表達式引發一個異常。throw後面緊隨一個表達式,其中表達式類型就是拋出異常的類型後面在跟一個分號
Sales_item item1, item2; //自己定義的一個類對象
cin >> item1 >> item2;
if (item1.isbin() == item2.isbin()) {
cout << item1+item2 <<endl;
return 0;//成功
} else {
cerr << "Data must refer to ..." << endl;
return -1;//錯誤
}
///-----------------------上面可改寫爲 同等
if (item1.isbin() != item2.isbin())
throw runtime_error("Data must refer to ..."); // 拋出異常,該異常爲runtime_error的對象,終止函數,並把控制權交給能處理該異常的代碼
cout << item1+item2 <<endl;
-
runtime_error 是標準庫異常類型的一種, 定義在
stdexceot
頭文件中。必須初始化此對象,方式:給它一個string對象夥子c的字符串
6.2 try語句塊
try
語句塊的通用語法形式是
-
一開始是try,隨後跟着一個塊,塊後跟着一個或多個catch子句
catch
: 包含三個部分- 關鍵字 catch
- 括號內一個對象的聲明(異常聲明)
- 一個塊
-
當選中了某個 catch子句處理異常後,一旦完成,程序就跳轉到最後一個catch子句之後的那個語句進行
也就是隻執行一個catch
try {
program-statements
} catch (exception-declaration) {
handler-statements
}catch (exception-declaration) {
handler-statements
} //...
-
沒個塊都是獨立作用域,聲明的其他地方都不能訪問
-
try可以嵌套
runtime_error er("error a+b<10"); while (cin >> a >> b) { try { int i; if (a+b > 10) throw runtime_error("a+b>10"); else if (a+b < 10) throw er; cout << a+b << endl; }catch (runtime_error err){ cout << err.what() << "\n Try Again? Enter y or n" <<endl; char c; cin >> c; if (! cin || c == 'n') break; // 跳出while } }
- 如果最終還是沒能找到任何匹配的catch子句,程序轉到名爲termi nate的標準
庫函數。該函數的行爲與系統有關,一般情況下,執行該函數將導致程序非正常退出。
- 如果最終還是沒能找到任何匹配的catch子句,程序轉到名爲termi nate的標準
6.3 標準異常
-
exception 頭文件定義了異常類exception 。他只報告異常的發生,不提供其他
-
stdexcept 包含了幾種常見了異常類如下:
-
new也定義了bad_alloc異常類型
-
type_info 定義了bad_cast 異常類型
-
我們只能默認初始化的方式初始化exception,bad_alloc和bad_cast對象,不允許爲這些對象提供初始值。
-
只定義了一個what成員函數
參考:c++ prime 第五版