C++复习 06 语句

 

声明,所有的朋友,如果要转我的帖子,务必注明"作者:黑啤 来源: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;
        }

        // 编译运行
        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;
        }

        // 编译及运行结果.
        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);
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值