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;
		}
	}
相关文章
相关标签/搜索