##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; } }