语句
1.switch语句
1 #include<iostream> 2 #include<string> 3 #include<vector> 4 using namespace std; 5 6 7 int main() 8 { 9 char ch; 10 int a=0,e=0,i=0,o=0,u=0; 11 while(cin>>ch) 12 { 13 switch(ch){ 14 case 'a':case'A': 15 ++a; 16 break; 17 case 'e':case'E': 18 ++e; 19 break; 20 case 'i':case'I': 21 ++i; 22 break; 23 case 'o':case'O': 24 ++o; 25 break; 26 case 'u':case'U': 27 ++u; 28 break; 30 default: 31 break; 32 } 33 } 34 cout<<a<<" "<<e<<" "<<i<<" "<<o<<" "<<u<<endl; 35 }
84
2. 在设计良好的程序中, 异常是程序错误处理的一部分
异常是运行时出现的异常
#include<stdexcept>
try {
if (true)
throwruntime_error(“error!”);
} catch (runtime_error err) {
cout << err.what() << endl;
}
先在当前代码中找catch,若没有匹配的,则一上层调用函数中寻找,若仍没找到,则一直找下去,最终由#include <exception>中定义的terminate终止程序执行
若程序在没有try catch的地方出现异常,则由terminate自动终止程序的执行
bitset的to_ulong操作,若提供的位数大于unsigned long的长度32位时,就异常overflow_error,查看t6_23
bitset<33> ib;
ib[ib.size()-1] = 1; // 最高位是1
try{
ib.to_ulong();
}catch (overflow_error err) {
cout<< "overflow" << endl;
cout<< err.what() << endl; // what返回const chat*
}catch (runtime_error err) {
cout<< "runtimeerror" << endl;
cout << err.what() << endl;
}
3. 异常类 #include <stdexcept>
exception // 最常见异常类
runtime_error // 下面几个运行时错
range_error // 生成的结果超出了有意义的值域范围
overflow_error // 上溢
underflow_error // 下溢
logic_error // 可在运行前检测到的问题,下面几个逻辑错
domain_error // 参数的结果值不存在
invalid_argument // 不合适的参数
length_error //超出该类型最大长度
out_of_range //使用一个超出有效范围的值
#include <new>
bad_alloc
#include <type_info>
bad_cast
以上红色的三个只有默认构造函数,不使用string初始化
4. 使用预处理器编写调试代码
#ifndef NDEBUG
cerr << “oh,shit!” << endl;
#endif
很多编译器执行时
$ CC –DNDEBUG main.C
相当于在main.c开头提供#define NDEBUG预处理命令
5. 预处理宏assert #include <cassert>
assert(expr)与NDEBUG配合使用的
只要NDEBUG没有定义,则执行assert,若为false则输出信息并终止程序的执行
测试不可能发生的条件
异常是处理预期要发生的错误,而断言是测试不可能发生的事情
一旦开发和测试完成,程序就已经建立好,并定义了NDEBUG。成品代码中,assert不执行,因此没有运行时代价,没有运行时检查。
assert仅用于检查确定不可能的条件,只对程序的调试有帮助,不能用来代替运行时的逻辑检查logic_error,也不能代替对程序可能产生的错误runtime_error的检查
6. 百度百科中:
编写代码时,我们总是会做出一些假设,断言就是用于在代码中捕捉这些假设,可以将断言看作是异常处理的一种高级形式。断言表示为一些布尔表达式,程序员相信在程序中的某个特定点该表达式值为真。
使用断言可以创建更稳定,品质更好且易于除错的代码。当需要在一个值为FALSE时中断当前操作的话,可以使用断言。单元测试必须使用断言
除了类型检查和单元测试外,断言还提供了一种确定各种特性是否在程序中得到维护的极好的方法。
使用断言使我们向按契约式设计更近了一步。
我这样理解,一座桥,有护栏,人们正常行走在上面,
assert(有个人翻越护栏跳进河)
assert(桥断了) // 这些都是我们认为不可能的,假设真的
上面是不可能发生的情况;
try {
if (护栏坏掉)
} catch(runtime_error err) {
cout << err.what() << endl;
}
while(cin >> s) {
assert(cin); // 多余的
}
string s;
while(cin >> s && s != sought) {}
assert(cin);
解释:在打开调试器的情况下,该循环从标准输入读入一系列单词,直到读入的单词与sought相等或遇到文件结束符。如果遇到EOF,则执行assert并终止程序。
如果关闭调试器,则assert不做任何操作
posted on 2014-06-11 22:41 vincent_SK 阅读(150) 评论(0) 编辑 收藏 举报