##C++ Primer 學習筆記(第五章:語句)express
[TOC]數組
###5.1 簡單語句函數
###5.2 語句做用域學習
###5.3 條件語句code
懸垂else
:else只與離他最近的還沒有匹配的if
匹配。對象
switch
語句:switch
括號裏的表達式的值必須能轉換成整數類型,而後與每一個case
裏的標籤值比較。case
標籤也必須是整形的常量表達式,且任意兩個標籤值不能相同。ci
char ch = getVal(); int ival = 42; switch (ch){ case 3.14://錯誤:case標籤不是一個整數 case ival://錯誤:case標籤不是一個常量 }
switch
語句中若是某個case
標籤匹配成功,將從該標籤開始日後順序執行全部case
分支(注意再也不有匹配標籤的限制,而是徹底執行),除非程序顯式地中斷(break
)。而若是但願兩個或更多個值共享同一組操做時,就會故意省略掉break
語句,使得程序可以連續執行若干個case
標籤。例如:作用域
unsigned vowelCnt = 0; //... switch (ch){ case 'a': case 'e': case 'i': case 'o': case 'u'://以上五個標籤也能夠寫在一行裏 ++vowelCnt; break; }
unsigned aCnt = 0, eCnt = 0, iCnt = 0, oCnt = 0, uCnt = 0; char ch; while (cin >> ch) switch (ch) { case 'a': case 'A': ++aCnt; break; case 'e': case 'E': ++eCnt; break; case 'i': case 'I': ++iCnt; break; case 'o': case 'O': ++oCnt; break; case 'u': case 'U': ++uCnt; break; }
###5.4 迭代語句字符串
當不肯定要迭代多少次,或者在循環結束後須要訪問控制變量時,使用while
循環比較合適。get
for
語句中定義的對象只在for
循環體內可見。
for (init-statement; condition; expression) statement
init-statement
能夠定義多個對象,可是隻能有一條聲明語句。所以全部變量的基礎類型必須相同。
for
語句能夠省略掉任意一個部分:
auto beg = v.begin(); for (; beg != v.end() && *beg >= 0; ++beg) ;
for (int i = 0; ; ++i) //對i處理,內部代碼負責終止過程
vector<int> v; for (int i; cin >> i; ) v.push_back(i);//
for (declaration : expression) statement
expression
必須是一個序列,包括:花括號括起來的初始值表、數組或者vector
和string
等類型對象,它們的共同點是能夠返回迭代器的begin
和end
成員。因此不能經過範圍for
語句來增長容器的元素。
do while
語句中不容許在條件中定義對象。注意while
後面有;
。do{ //... }while(/*...*/);
###5.5 跳轉語句
break
語句的做用範圍僅限於最近的循環或者switch
。
continue
語句終止最近的循環(for
、while
、do while
)中的當前迭代,並當即開始下一次迭代。
###5.6 try語句塊和異常處理
throw
表達式:表達遇到了沒法處理的問題。throw runtime_error("...");
try
語句塊:拋出異常。try{ program-statements//程序的正常邏輯 }catch (exception-declaration){//異常聲明 handler-statements }catch (exception-declaration){ handler-statements }//...
注意try
語句塊內聲明的變量在塊外部沒法訪問,特別是在catch
子句內也沒法訪問。
當異常被拋出時,首先搜索拋出該異常的函數。若是沒找到匹配的catch
子句,終止該函數,並在調用該函數的函數中繼續尋找,以此類推,沿着程序的執行路徑逐層回退,直到找到適當類型的catch
子句爲止。 若是仍是沒有找到任何匹配的catch
子句,程序將轉到名爲terminate
的標準庫函數,而執行該函數將致使程序非正常退出。對於沒有任何try
語句塊定義的異常,也將按照這種方式處理。
C++
標準異常定義在4個頭文件中: exception
定義了最通用的異常類exception
,只報告異常的發生,不提供額外信息。 stdexcept
定義了幾種經常使用的異常類,如runtime_error
、range_error
等。 new
頭文件定義了bad_alloc
異常類型。(12章) type_info
頭文件定義了bad_cast
異常類型。(19章)
異常類型只定義了一個名爲what
的成員函數,返回值是一個C
風格字符串常量,用於提供一些異常的文本信息。
int a, b; cout << "Input:" << endl; while (cin >> a >> b){ try{ if (b == 0) throw runtime_error("divisor is 0"); cout << static_cast<double>(a) / b << endl; break; }catch (runtime_error err){ cout << err.what() << endl; cout << "Try again" << endl; cout << "Input:" << endl; } }