##C++ Primer 学习笔记(第五章:语句)
[TOC]
###5.1 简单语句
- 空块的作用等价于空语句。
###5.2 语句作用域
###5.3 条件语句
-
悬垂
else
:else只与离他最近的尚未匹配的if
匹配。 -
switch
语句:switch
括号里的表达式的值必须能转换成整数类型,然后与每个case
里的标签值比较。case
标签也必须是整形的常量表达式,且任意两个标签值不能相同。
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
循环比较合适。 -
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 v;for (int i; cin >> i; ) v.push_back(i);//
- 范围for语句
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(a) / b << endl; break; }catch (runtime_error err){ cout << err.what() << endl; cout << "Try again" << endl; cout << "Input:" << endl; } }