五、语句
5.1简单语句
表达式语句: 执行表达式并丢弃求值结果;
空语句;
复合语句(块);
5.2语句作用域
5.3条件语句
1.悬垂else
2.switch语句:如果表达式和某个case标签的值匹配成果,程序从该标签之后的第一条语句开始执行,直到到达了swich的结尾或者是遇到一条break语句为止。
1.case标签必须是整型常量表达式;
2.default也是一种特殊的case标签;
3.不允许跨国变量的初始化语句直接跳转到该变量作用域内的另一个位置;
5.4迭代语句
循环:
for (decltype(s.size) index = 0; index != s.size() && !isspace(s[index]); ++index)
s[index] = topper(s[index]);
1.for语句 :只能有一句声明(或者空语句),但可以定义多个对象。
2.范围for:
for (declaration : expression)
statement
其中:
1.expression必须是一个序列,初始值列表、数组、或者vector或string,共同特点是拥有能返回迭代器的begin和end成员。
2.declaration定义一个变量,序列中每个元素都可以转换成该变量的类型,最好用auto
3.对于需要修改序列元素的值,可以将declaration定义为引用
4.由于范围for预设了end,验证了之前说的不能在范围for语句中增加vector对象的元素。
3.do while语句
变量声明放在循环体中
string rsp;
do {
cout << " 输入两个字符串: ";
string str1, str2;
cin >> str1 >> str2;
cout << (str1 <= str2 ? str1 : str2) << " 比另一个小。 "
<< "\n\n"
<< " 再一次? 输入yes或者no: ";
cin >> rsp;
} while (!rsp.empty() && rsp[0] == 'y');
5.5跳转语句
5.5.1 break语句
只能出现在迭代语句或者switch语句内部,终止离他最近的。
5.5.2 continue语句
终止最近的循环中的当前迭代并立即开始下一次迭代
1.只能出现在for、while、do while、循环的内部,或者嵌套在此类循环力的语句或块的内部
2.对于switch,只能switch语句嵌套在迭代语句内部时,才能在switch中使用continue
5.5.3goto语句:别用
goto label;//label是用于标志一条语句的标识符
5.6 try语句块和异常处理
异常处理机制:异常检测和异常处理两部分
5.6.1throw表达式
程序的异常检测部分使用throw表达式引发一个异常。
throw runtime_error("Date must refer to same ISBN");
runtime_error是标准库异常类型一种,在stdexcept头文件中
5.6.2 try语句块
同意语法形式是:
try {
program-statements
} catch (exception-declaration异常声明){
handler-statements
} catch (exception-declaration){
handler-statements
}//......
1.当选中了某个catch子句处理异常之后,执行与之对应的块;完成后向后继续执行。
2.try语句块内声明的变量在快外部无法访问,特别是在catch子句内也无法访问。
while (cin >> item1 >> item2) {
try {
//执行添加两个对象的代码
//如果添加失败,代码抛出一个runtime_error err异常
}
catch (runtime_error err) {
cout << err.what
//err的类型是runtime_error err,what成员函数的返回值是const char*
//本题中,返回的是初始化一个具体对象是所用的string对象的副本
<< "\nTry Again? Enter Y or N" << endl;
char c;
cin >> c;
if (!cin || c == 'n')
break;//跳出while循环
}
}
try语句块可能相互包含,一直寻找,最终没找到,程序转到名为terminate的标准库函数
5.6.3标准异常
exception头文件定义了exception,只报告异常的发生
stdexcept定义几种常用的异常类
new头文件定义了bad_alloc异常类型
type_info头文件定义了bad_cast异常类型
例:整数相除计算:
#include<iostream>
#include <string>
using namespace std;
int main()
{
int a, b;
cout << "Input two integers: "<<endl;
while (cin >> a >> b) {
try {
if (b == 0) throw runtime_error("divisor is 0");
cout << static_cast<double>(a) / b << endl;
}
catch (runtime_error err) {
cout << err.what();
cout << "\nTry Again?Input Y or N: " << endl;
char c;
cin >> c;
if (!cin || c == 'N')
break;
else
cout << "Input two integers" << endl;
}
}
return 0;
}