开源中文网

您的位置: 首页 > 编程开发 > C++语言编程 > 正文

通过实例学习C++的基础语句

来源:  作者:

程序都是又一句一句的语句组成起来的,如果要想学的好,那么先从基础开始吧 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不能为空. [Page] 
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块和异常处理.(本节对异常处理的介绍实在少的可怜) 
异常就是程序的不正常情况,例如内存耗尽,或意外的非法输入.异常存在于程序的正常功能之外,并要求程序立即处理. 
异常机制提供程序中错误检测和错误处理部分之间的通信,包括: 
[NextPage] 

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; [Page] 
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 

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. 

[NextPage] 


2. stdexcept头文件,定义了几种常见的异常类. 
exception 最常见的问题. 
runtime_error 运行时错误: 仅在运行时才能检测到的问题. [Page] 
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__ 当前行号 [Page] 
__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; 

// 编译及运行结果. 
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); 

Tags:语句 实例 基础
关于开源中文网 - 联系我们 - 广告服务 - 网站地图 - 版权声明