语句
switch-case语句
unsigned aCnt = 0, iCnt = 0, eCnt = 0, oCnt = 0, uCnt = 0;
char ch;
while(cin >> ch){
switch (ch){
case 'a':
++aCnt;
break;
case 'e':
++eCnt;
break;
case 'i':
++iCnt;
break;
case 'o':
++oCnt;
break;
case 'u':
++uCnt;
break;
default :
break;
}
}
case标签必须是整型常量表达式。
传统for循环
for (init-statement; condition; expression)
statement
能省略掉三个部分中任意一个或者全部。如果省略condition,则默认为true。
但是init-statement只能由一句声明语句,因此所有的变量基础类型必须相同。
范围for语句
C++11新标准
for (declaration : expression)
statement
while语句
while (condition)
statement
do-while语句
do
statement
while (condition); //注意分号
condition变量必须定义在循环体之外。
try语句块和异常处理
throw表达式
Sales_item item1, item2;
cin >> item1 >> item2;
if(item1.isbn() != item2.isbn()){
throw runtime_error("Data must refer to the same ISBN"); //字符串初始化一个runtime_error对象
}
cout << item1 + item2 <<endl;
try语句块
try{
program-statements
}
catch (exception-declaration){
handle-statements
}
catch (exception-declaration){
handle-statements
}
其中声明在try语句块内部的变量在外部无法访问,catch块中也是。
标准异常
异常类包含在4个头文件中。
-
exception头文件定义了最常用的异常类exception。只报告异常的发生,不提供任何额外信息。
-
stdexcept头文件定义了集中常用的异常类。
-
new头文件定义了bad_alloc异常类型。
-
type_info定义了bad_cast异常类。
stdexcept定义的异常类 exception 最常见的问题 runtime_error 只有运行时才能检测出来的问题 range_error 运行时错误:生成的结果超出了有意义的值域范围 overflow_error 运行时错误:计算上溢 underflow_error 运行时错误:计算下溢 logic_error 程序逻辑错误 domain_error 逻辑错误,参数对应的结果值不存在 invalid_argument 逻辑错误:无效参数 length_error 逻辑错误:试图创建一个超出该类型最大长度的对象 out_of_range 逻辑错误:使用一个超出有效范围的值 对于exception、bad_alloc、bad_cast,只能以默认初始化的方式初始化,不允许为这些对象赋初值。
而其他类型的对象恰好相反,应当使用string对象或者C风格字符串初始化这些类型的对象,不能使用默认初始化方式。
异常类型只定义了一个what()成员函数,没有任何参数,返回一个指向C风格字符串的const char*。小练习 :
编写一个程序,从标准输入读取两个数,输出第一个数除以第二个数的结果。用try语句捕获异常,并输出相应提示信息。#include<iostream> #include<stdexcept> using std::cin; using std::cout; using std::endl; using std::runtime_error; int main(){ int num1, num2; int ans; cin >> num1 >> num2; try{ if(num2 == 0){ throw runtime_error("Divided by 0!!"); } ans = num1 / num2; cout << ans << endl; } catch (runtime_error err){ cout << err.what() << "\nTry again? Enter y or n ." << endl; char c; cin >> c; if (!cin || c == 'n'){ break; } } return 0; }