C++ Primer 學習筆記(第五章:語句)

##C++ Primer 學習筆記(第五章:語句)express


[TOC]數組


###5.1 簡單語句函數

  1. 空塊的做用等價於空語句。

###5.2 語句做用域學習


###5.3 條件語句code

  1. 懸垂else:else只與離他最近的還沒有匹配的if匹配。對象

  2. 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 迭代語句字符串

  1. 當不肯定要迭代多少次,或者在循環結束後須要訪問控制變量時,使用while循環比較合適。get

  2. for語句中定義的對象只在for循環體內可見。

for (init-statement; condition; expression)
	 statement
  1. init-statement能夠定義多個對象,可是隻能有一條聲明語句。所以全部變量的基礎類型必須相同。

  2. 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);//
  1. 範圍for語句
for (declaration : expression)
	 statement

expression必須是一個序列,包括:花括號括起來的初始值表、數組或者vectorstring等類型對象,它們的共同點是能夠返回迭代器的beginend成員。因此不能經過範圍for語句來增長容器的元素。

  1. do while語句中不容許在條件中定義對象。注意while後面有;
do{
//...
}while(/*...*/);

###5.5 跳轉語句

  1. break語句的做用範圍僅限於最近的循環或者switch

  2. continue語句終止最近的循環(forwhiledo while)中的當前迭代,並當即開始下一次迭代。


###5.6 try語句塊和異常處理

  1. throw表達式:表達遇到了沒法處理的問題。
throw runtime_error("...");
  1. try語句塊:拋出異常。
try{
	 program-statements//程序的正常邏輯
}catch (exception-declaration){//異常聲明
	 handler-statements
}catch (exception-declaration){
	 handler-statements
}//...

注意try語句塊內聲明的變量在塊外部沒法訪問,特別是在catch子句內也沒法訪問。

  1. 當異常被拋出時,首先搜索拋出該異常的函數。若是沒找到匹配的catch子句,終止該函數,並在調用該函數的函數中繼續尋找,以此類推,沿着程序的執行路徑逐層回退,直到找到適當類型的catch子句爲止。 若是仍是沒有找到任何匹配的catch子句,程序將轉到名爲terminate的標準庫函數,而執行該函數將致使程序非正常退出。對於沒有任何try語句塊定義的異常,也將按照這種方式處理。

  2. C++標準異常定義在4個頭文件中: exception定義了最通用的異常類exception,只報告異常的發生,不提供額外信息。 stdexcept定義了幾種經常使用的異常類,如runtime_errorrange_error等。 new頭文件定義了bad_alloc異常類型。(12章) type_info頭文件定義了bad_cast異常類型。(19章)

  3. 異常類型只定義了一個名爲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;
		}
	}
相關文章
相關標籤/搜索