声明,所有的朋友,如果要转我的帖子,务必注明"作者:黑啤 来源:CSDN博客"和具体的网络地址http://blog.csdn.net/nx500/archive/2007/10/22/1837004.aspx,并且我的所有博客内容,禁止任何形式的 商业用途,请大家尊重我的劳动.谢谢!
目 录
六.语句.
001 程序语句最简单的形式是空语句,使用如下形式.
; // NULL statement 每个空语句都应该加上注释,以便任何读这段代码的人知道该语句是有省略意义的.
// 读入值,直到输入流的结尾或者输入的值与sought相同.
while(cin >> s && s != sought)
;
无关的空语句可能会产生意外的坏处,比如在while或者if后边悄悄的出现个分号(空语句),将会彻底改变程序的结构.
while(iter != svec.end());
++iter; // 这很可能(99.999%)是一个死循环.
002 复合语句通常被称为块,是用一对花括号括起来的语句序列.块标识了一个作用域.
作用域的范围,主要是指定义变量的作用范围.
003 if语句.
if (condition)
statement; // 此处多用于一个块,即使只有一条语句,用一个块来表示也是安全的.
vector类型和string类型,一般不可用作条件.
if (condition)
statement1;
else
statement2;
多分支结构,要注意悬垂else问题: else总是匹配给最后出现的尚未匹配的if子句.
if (condition1)
statement1;
else if (condition2)
statement2;
004 switch case语句,提供一种更方便的方法来实现深层嵌套的if/else逻辑.
使用"break;"语句在适当的地方跳出.使用default语句处理case不到的情况.
case标号必须是整型常量表达式.
在switch结构中,只能在它的最后一个case标号或default标号后面定义变量.
005 while语句,当条件为真时,while语句反复执行目标语句.
while(condition) // condition不能为空.
statement;
while循环的应用.
int *source = arr1;
size_t sz = sizeof(arr1)/sizeof(*arr1);
int *dest = new int[sz];
while (source != arr1 + sz)
*dest++ = *source++; // 书上说,这是一个经典C++简洁表达式的例子,个人认为会误导一些人,
// 对于数组指针这样是可以的,冗余相对很少,可如果是两个对象呢?冗余空间的需求就大了
006 for循环语句.
for(int-statement; condition; expression)
statement;
初始化,判断条件,执行statement,执行expression,判断条件,执行statement,执行expression.
007 do while语句.
do
statement;
while(condition);
注意while后边有个分号,statement语句至少执行一次.
008 break语句用于结束最近的while,do while,for 或switch语句,并将程序的执行权传递给紧接在被终止语句之后的语句.
009 continue语句导致最近的循环语句的当次循环提前结束.
对于while和do while语句,继续求解循环条件,对于for循环,程序流程接着求解for语句头中的expression表达式.
010 try块和异常处理.(本节对异常处理的介绍实在少的可怜)
异常就是程序的不正常情况,例如内存耗尽,或意外的非法输入.异常存在于程序的正常功能之外,并要求程序立即处理.
异常机制提供程序中错误检测和错误处理部分之间的通信,包括:
1. throw表达式,错误检测部分使用这种表达式来说明遇到了不可处理的错误.throw引发了异常条件.
2. try块,错误处理部分使用它来处理异常.以try开始,并以一个或多个catch子句结束.
3. 由标准库定义一组异常类,用来在throw和相应的catch之间传递有关的错误信息.
一个调用异常处理的例子
#include
<
iostream
>
#include < stdexcept >
#include " Sales_item.h "
#include " Sales_item.cpp "
using std::cin;
using std::cout;
using std::endl;
using std::runtime_error;
int main( void ) {
Sales_item item1, item2;
while(cin >> item1 >> item2){
try{
if(item1.same_isbn(item2)){
cout << item1 + item2 << endl;
} else {
throw runtime_error("Data must refer to same ISBN");
}
} catch (runtime_error e){
cout << e.what() // e.what()返回throw异常中的提示信息
<< " Try again? Enter y or n" << endl;
char c;
cin >> c;
if (cin && c == 'n')
break;
}
}
cout << item1 << endl;
return 0;
}
#include < stdexcept >
#include " Sales_item.h "
#include " Sales_item.cpp "
using std::cin;
using std::cout;
using std::endl;
using std::runtime_error;
int main( void ) {
Sales_item item1, item2;
while(cin >> item1 >> item2){
try{
if(item1.same_isbn(item2)){
cout << item1 + item2 << endl;
} else {
throw runtime_error("Data must refer to same ISBN");
}
} catch (runtime_error e){
cout << e.what() // e.what()返回throw异常中的提示信息
<< " Try again? Enter y or n" << endl;
char c;
cin >> c;
if (cin && c == 'n')
break;
}
}
cout << item1 << endl;
return 0;
}
heipi@Linux:~/Documents/CPP> g++ -o o 06010.cpp
heipi@Linux:~/Documents/CPP> ./o
9-999-9999 2 30
9-999-9989 3 45
Data must refer to same ISBN
Try again? Enter y or n
y
9-999-9989 2 30
9-999-9989 3 45
9-999-9989 5 195 39
heipi@Linux:~/Documents/CPP>
寻找处理代码的过程就是一个look up的过程,如果look up一路都找不到对应的catch,就要调转到系统的terminate函数.
通常情况下,terminate会导致程序非正常退出.
C++定义了一组类,用于报告在标准库中的函数遇到的问题,程序员可在自己的程序中,使用这些标准异常.
1. exception头文件,定义了最常见的异常类,类名是exception.
2. stdexcept头文件,定义了几种常见的异常类.
exception 最常见的问题.
runtime_error 运行时错误: 仅在运行时才能检测到的问题.
range_error 运行时错误: 生成的结果超出了有意义的值域范围.
overflow_error 运行时错误: 计算上溢.
underflow_error 运行时错误: 计算下溢.
logic_error 逻辑错误: 可在运行前检测的问题.
domain_error 逻辑错误: 参数的结果值不存在.
invalid_argument 逻辑错误: 不合适的参数.
length_error 逻辑错误: 试图生成一个超出该类型最大长度的对象.
out_of_range 逻辑错误: 使用一个超出有效范围的值.
3. new头文件定了bad_alloc异常类型.
4. type_info头文件定义了bad_cast异常类型.
exception,bad_alloc和bad_cast类型只定义了默认构造函数,无法在创建这些类型的时候为他们提供初始值.
其他的异常类型则只定义一个使用string初始化的构造函数和名为what的操作.
011 使用预处理器进行调试.
可使用NDEBUG预处理变量实现有条件的调试代码.
int main(){
#ifndef NDEBUG
cerr<<"starting main"<<endl;
#endif
}
默认的情况下NDEBUG没有定义,调试时会执行cerr代码,正式发布前,使用如下的编译命令定义关闭调试代码.
$ CC -DNDEBUG main.c
预处理器还定义了其余四种调试时有用的常量.
__FILE__ 文件名
__LINE__ 当前行号
__TIME__ 编译的时间
__DATE__ 编译的日期
//
06011.cpp
#include < iostream >
using std::cout;
using std::endl;
int main() {
cout << "file: " << __FILE__
<< " line: " << __LINE__
<< " Date: " << __DATE__
<< " Time: " << __TIME__ << endl;
return 0;
}
#include < iostream >
using std::cout;
using std::endl;
int main() {
cout << "file: " << __FILE__
<< " line: " << __LINE__
<< " Date: " << __DATE__
<< " Time: " << __TIME__ << endl;
return 0;
}
Nan@linux-g4n6:~/Documents> g++ -o o 06011.cpp
Nan@linux-g4n6:~/Documents> ./o
file: 05011.cpp
line: 8
Date: Oct 2 2007
Time: 13:25:39
Nan@linux-g4n6:~/Documents>
使用断言来调试"不可能发生"的条件.
// 只要NDEBUG未定义,assert宏就求解条件表达式expr,结果为false,assert就输出信息并结束程序.
assert(expr);