2010/11/6
关键字:语句
零散知识点
1. for循环中声明的变量在for循环外是不可见的,但是早期C++编译器还是支持的.VC8不支持,VC6支持.
2. 悬垂else.
if (/**/)
if (/**/)
{
}
else
{
}
else实际是对应内层的if的.
else匹配给最后出现的尚未匹配的if字句.
3. switch…case语句需要break时别忘了break语句即可.通常还是要加default标号,即使后面跟一个空语句也可以,是为了告诉它的读者考虑到了这种情况,虽然没有什么可执行的.case标号必须是整型常量表达式,并且不能重复.
string str = "123";
switch (str) //必须是整型常量表达式
{
case "123:
break;
case "234:
break;
}
4. 对于switch语句,不加块语句时只能在它的最后一个case或default标号后面定义变量;加块语句则任何标号后都可以.
switch (i)
{
case 1:
{ //有块语句
int j = 0;
j = 1;
}
break;
case 2:
int z = 0; //不用加块语句则只能放在最后一个标号
break;
}
推荐每个标号后都用{}括号.
5. while循环条件中定义的变量,每次循环都会创建、初始化、撤销,所以尽量不要在循环条件中定义变量.
6. 不允许使用goto语句.
try…catch
匹配catch步骤:
假如,一个try块可能调用包含另一try块的函数,它的try块又调用了含有try块的另一个函数,依次类推.
寻找处理代码的过程与函数调用链相反.抛出一个异常时,首先要搜索的是抛出异常的函数.如果没有找到匹配的catch,则终止这个函数的执行,并在调用这个函数的函数中寻找匹配的catch.如果依然没有找到相应的处理代码,该函数同样终止,搜索调用它的函数.如此类推,继续按执行路径回退,知道找到合适的catch为止.
如果不存在处理该异常的catch子句,程序的运行将跳转到terminate标准库函数.该函数在exception头文件中定义.这个标准库函数的行为依赖于系统.通常它的执行会导致程序非正常退出.
没有定义try块和没有任何catch块捕捉到异常的效果是一样的.
异常类 | 描述 | 头文件 |
exception | 最常见的错误 | stdexcept |
runtime_error | 运行时错误:仅在运行时才能检测到的错误 | stdexcept |
range_error | 运行时错误:生成的结果超出了有意义的值域范围 | stdexcept |
overflow_error | 运行时错误:计算上溢 | stdexcept |
underflow_error | 运行时错误:计算下溢 | stdexcept |
logic_error | 逻辑错误:可在运行前检测到的问题 | stdexcept |
domain_error | 逻辑错误:参数的结果值不存在 | stdexcept |
invalid_argument | 逻辑错误:不合适的参数 | stdexcept |
length_error | 逻辑错误:试图生成一个超过该类型最大长度的对象 | stdexcept |
out_of_range | 逻辑错误:使用一个超出有效范围的值 | stdexcept |
bad_alloc | 无法分配内存由new抛出的异常 | new |
bad_cast | 错误的强制类型转换 | type_info |
上述异常类型只定义了一个操作,what().返回const char*的指针,指向一个C风格的字符串,描述异常信息.跟具体编译器有关.