【面向对象】5.语句

语句

简单语句

  • 语法上需要一条语句,逻辑上不需要时,使用空语句

    • 应该加上注释,从而让读代码的人知道这条语句是有意省略的
    • 多余的空语句并非总是无害的,可能导致死循环
  • 语法上需要一条语句,逻辑上需要多条语句,则应使用复合语句

    • 空块:内部没有任何语句的一对花括号,等价于空语句

    • while (i <= 10)

      ans += i, ++i;可以用逗号替代,但是代码的可读性降低

条件语句

  • if后的条件一定要用括号括起来

  • case关键字 后面的值一定要是整型常量表达式,break语句一般不会省略,不写要也注释

    • ```case 1: case 3: case 5: case 7: case 9:``
    • 而非case 1, 3, 5, 7, 9:
  • default标签 告诉读者已经考虑了默认情况

  • noskipws (no skip whitespace) 不省略空格、制表、空白符,可以保留默认跳过的空格

  • ix = static_cast(ivec.size())-1;size() 类型转换

迭代语句

  • while(beg!=v.end()&&*beg>=0)注:利用短路求值 要先判断是否到了末尾

  • using std::pair;键值对

  • pair<string, int> max_duplicated;
    int count = 0;
    for (string str, prestr; cin >> str; prestr = str) //前后迭代在for中的使用
    {
        if (str == prestr) ++count;
        else count = 0;
        if (count > max_duplicated.second) max_duplicated = { prestr, count };
    }// 键值对用法示例,实际count需要在此基础上+1
    
  • 范围for语句

    • for(declaration:expression)
      statement
      
      • expression 必须是一个序列,如花括号初始值列表、数组、vector、string 共同特点是能返回迭代器的begin和end成员

      • declaration定义一个变量,可以用auto类型说明符。

      • vector<int> v={0,1,2,3,4,5,6,7,8,9}
        for(auto &r:v){
           r*=2;
        }
        //等价于
        for(auto beg=v.begin(),end=v.en();beg!=end;++beg){
            auto &r=*beg;
            r*=2;  
        }//不能通过范围for语句增加vector对象的元素,否则begin end返回值会被改变
        
  • DO WHILE语句

    • do
        statement
      while(condition);//最后的分号不能少
      
    • 不允许在条件部分定义变量,因为在后面

    •  while (!rsp.empty() && tolower(rsp[0]) == 'y');//兼顾用户交互和默认情况
      
  • break语句: 作用范围仅限于最近的循环或switch

  • if (cin.eof()) //判断输入是否结束,即正常结束文件
    
  • continue:

    • 用于离它最近的循环
    • 只有switch语句嵌套在迭代语句内部时,才能在switch里使用continue
    • while do while,继续判断条件的值
    • 传统for循环 继续指向for语句头expression
    • 范围for循环 用序列下一个元素初始化循环控制变量
  • goto:

    • 不能将程序的控制权从变量的作用域之外转移到作用域之内

    • 跳回变量定义之前意味着系统销毁变量,重新创建它

    • goto label;
      //label 用于标识一条语句的标识符
      //带标签语句,在语句前有一个标识符以及一个冒号
      label: ;//带标签语句,可用作goto的目标
      //标签标识符独立于变量和其它标识符
      

TRY语句块和异常处理

if (item1.isbn() != item2.isbn())
throw runtime_error("Data must refer to same ISBN");
// if we're still here, the ISBNs are the same
cout << item1 + item2 << endl;
} catch (runtime_error err) {
//runtime_error 是标准库异常种类的一种,定义在stdexcept头文件
//初始化runtime_error ,给它提供一个string或c字符串
try{
program-statements
}catch (excetion-declaration){
handle-statements
}catch (excetion-declaration){
handle-statements
}//..
//try语句块内声明的变量在块外无法访问,catch子句内也无法访
while (cin >> item1 >> item2) {
try {
  if (item1.isbn() != item2.isbn())
  throw runtime_error("Data must refer to same ISBN");
   cout << item1 + item2 << endl;
   } catch (runtime_error err) {
            cout << err.what()//输出给出的字符串
           << "\nTry Again? Enter y or n" << endl;
            char c;
            cin >> c;
            if (!cin || c == 'n')
            break; // break out of the while loop
           } // ends the catch clause
} // ends the while 
  • c++库函数定义了一组异常类

    • exception头文件定义了最通常的异常类exception,只报告异常发生不提供额外信息
    • stdexcept头文件定义了几种常见异常类
    • new头文件定义了bad_alloc异常类
    • type_info头文件定义了bad_cast异常类
  • stdexcept头文件定义了几种常见异常类

  • excpetion //最常见的问题

  • runtime_error //只有在运行时才能检测出的问题

  • range_error //运行时错误:生成的结果超出有意义的范围

  • overflow_error //运行时错误:计算上溢

  • underfloe_error //运行时错误:计算下溢

  • logic_error //程序逻辑错误

  • domain_error //逻辑错误:参数对应的结果不存在

  • invalid_argument //逻辑错误:无效参数

  • length_error //逻辑错误:试图创建一个超出类型虽大长度的对象

  • out_of_range //使用一个超出有效范围的

  • 默认初始化 exception bad_alloc bad_cast

  • 其它异常类型,应该使用string或c风格字符串初始化对象,不允许默认初始化

  • 异常类型只有一个what的成员函数,没有参数,返回值是c风格字符串的const char*

    • 提供关于异常的一些文本信息
    • 有字符串初值:what成员函数返回字符串
    • 其它异常类型:由编译器决定

    ps: 课堂笔记,在不懂的知识方面大多给出了老师的内容

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值