c++ 基礎語句 簡述

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的標準
      庫函數。該函數的行爲與系統有關,一般情況下,執行該函數將導致程序非正常退出。

6.3 標準異常

  • exception 頭文件定義了異常類exception 。他只報告異常的發生,不提供其他

  • stdexcept 包含了幾種常見了異常類如下:

  • new也定義了bad_alloc異常類型

  • type_info 定義了bad_cast 異常類型
    異常

  • 我們只能默認初始化的方式初始化exception,bad_alloc和bad_cast對象,不允許爲這些對象提供初始值。

  • 只定義了一個what成員函數


參考:c++ prime 第五版

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章