C++ Primer(第五版)第五章-语句读书笔记。

  1. switch语句

    两点:

    1. case标签中的值必须是整型常量

      case标签:case关键字和后面的字,称为case标签。

    2. case中定义变量,要加大括号。

      大括号才能建立一个块。块内才能建立内部变量。

  2. 范围for语句(range for statement)

    容器需要满足的条件:返回迭代器的begin、end成员。如 大括号包括的元素string、vector等。

     for(auto i : {1,2,3}) std::cout << i ;
     for(auto i : "123") std::cout << i ;
     for(auto i : std::string("123")) std::cout << i ;
    
    1. 使用

      for(auto & r : v){} //声明为引用可更改v中元素 for(auto r : v){} // 只可读

    2. 不可通过范围for语句修改迭代容器的大小!

      因为预存了end()值。(这说明传统for语句每次都会执行end、size等语句的,而没有预存该值?)

  3. while循环条件判断部分(括号中)可以声明变量

     while(int i = get_num())
    

    注意,赋值语句的返回值就是该值,所以如果i为0则循环停止。

  4. 异常处理结构

     try
     {
         if( i > 10 ) 
         {
             throw runtime_error("i must less than 10") ;
         }
    
     }
     catch(runtime_error re)
     {
         cerr << re.what() ;
     }
    

    异常需要手动抛(其实任何语言应该都是手动抛的…只不过自己在调别人写的函数,别人的函数里抛异常了…);捕获倒是应该比较通用。

    附上示例代码:

     cin >> a >> b ; 
     try 
     {   
         if( 0 == b) throw runtime_error("divider is zero") ;
     }   
     catch(runtime_error err)
     {   
         cerr << err.what() ;
         return -1 ;
     }   
     int rst =  a / b ; 
     cout << rst << endl ;
    

    try 后面似乎一定要跟上大括号,不能像for、while等单语句时可省略括号。

    如果错误没有被catch到,会跳到标准库中的terminate函数中。该函数处理退出状态,正常退出也是到这个函数。