梗概:本章介绍了C++语言中的一些语句的格式和几种特殊语句。
表达式加上分号即为表达式语句。单个分号是空语句。
使用花括号括起来的叫一个复合语句,也叫块。空块等价于空语句。
练习5.1 只有个分号的语句叫空语句。 逻辑需要实际不需要时。
练习5.2 花括号括起来的叫块。使用多条语句时。
if switch while 和for等控制语句中可以定义变量。
在内部定义的变量作用范围就在内部。变量需要初始化。
两种条件语句,if和switch。
if (condition) statement else statement2
if 语句可以嵌套使用。注意花括号的使用。
else匹配if叫做悬垂else。else与离它最近的尚未匹配的if匹配。
使用花括号也可以改变else的匹配路径。
练习5.7 (a) 少了分号 (b) 没加花括号 (c) 在外部定义变量 (d) ival==0
switch(ch) { case 'a': statement;break; case 'b':statement;break; }
如果表达式与某个case匹配成果,那么跳转到这个case开始执行到结束或遇到break。
case标签必须是整型常量表达式,任两个标签不能相同。
一般情况下每个case语句后面都要加break,除了特殊要求。
default标签是当没有其它case语句能够匹配时,执行default标签后面的语句。
switch内部的跳转,不能从一个带有初值的变量作用域之外跳到作用域之内。因为C++规定不允许跨过变量的初始化语句跳转到该变量作用域内的另一个位置。
练习5.13 (a) 漏掉break;(b) 跳过初始化语句 (c) case 1:case 3: case 5:... (d) case 枚举整型常量表达式
while (condition) statement
不确定循环次数使用while较好,循环后想访问控制变量需要在while外定义。
for (init-statement;condition;expression) statement
执行顺序,先init-statement, 接着判断condition,true则执行statement,然后接expression。然后判断condition循环。
init-statement可以定义多个变量,但只能有一条声明语句,因此基础类型必须相同。
for语句头里的三个部分都可以选择省略,但分号不能省。
习题5.15 (a) ix作用域在for里面。 (b) 没有初始化语句 (c) 无法结束
for (declaration : expression) statement
expression表示的必须是一个序列,能够返回迭代器begin和end。
如果需要对序列中的元素进行写操作,需要声明成引用类型。
不管条件如何都至少执行一次循环。
condition使用的变量必须定义在循环体之外。
练习5.18 (a) 没加花括号 (b) 定义需要在循环体外面 (c) 定义在循环体外部
break语句负责终止离它最近的for、while、do while 或者switch语句。并从这些语句结束后的第一句开始执行。
continue语句终止最近的循环中的当前迭代并立即开始下一次迭代。
for、while和do while中。
不要在程序中使用goto语句。
throw表达式引发异常。
try语句块 catch子句来处理异常代码。
一套异常类表达异常。
throw表达式包含关键字throw后面接抛出的异常。
throw runtime_error("Data must refer to same ISBN");
try {statement } catch(expression-declaration) { handler}
catch子句中包含一个异常声明以及一个块用来处理异常。
函数中出现异常会不断像函数栈上层传递,直到遇到匹配的catch语句。否则转到terminate函数库。
异常类有 exception stdexcept new type_into四个头文件中定义。
其中exception、bad_alloc 和 bad_cast只能用默认初始化,其它的必须使用string或c风格字符串初始化。
异常类型只有what一个成员函数,返回const char *。
习题5.23 5.24 5.25
#include
using namespace std;
int main()
{
while (true) {
try {
int a, b;
cin >> a >> b;
if (b == 0)
throw runtime_error("cannot be zero.");
cout << a / b;
}
catch (runtime_error err) {
cout << err.what() << endl;
cout << "do you want try again? y or n: ";
char c;
if (!(cin >> c) || c == 'n')
break;
}
}
return 0;
}