C++ Primer 学习笔记10 语句 (空语句、if语句、switch语句、for语句、dowhile语句、break语句、goto语句、continue语句、try块和异常处理)

空语句

用于语法上需要一个语句,而逻辑上并不需要的位置,此时需要一个空语句,

    while (cin >> s && s != sought)
        ;	//空语句
if语句

if(minVal<=ivec[i])
          if(minVal==ivec[i])
              ++occurs;
else
  {
      minVal=ivec[i];
      occurs=1;
}

上述程序中if子句多于else子句时,对于每个else,究竟归宿哪个if语句?

通过将else匹配给最后出现的尚未匹配的if子句来解决。此时,上述程序等价于

if(minVal<=ivec[i])
          if(minVal==ivec[i])
              ++occurs;
          else<pre name="code" class="cpp" style="font-size: 14px; line-height: 26px;">          {
             minVal=ivec[i];
             occurs=1;
           }

 

switch语句

 switch语句提供了一种更方便的的方法来实现深层次嵌套的if/else逻辑

    char ch;
    int aCnt = 0,eCnt = 0,iCnt = 0,
        oCnt = 0,uCnt = 0;

    while (cin >> ch)
    {
        switch (ch)
        {
        case 'a':
            ++aCnt;	//不要忘记后面的break标号!
            break;
        case 'e':
            ++eCnt;
            break;
        case 'i':
            ++iCnt;
            break;
        case 'o':
            ++oCnt;
            break;
        case 'u':
            ++uCnt;
            break;
        }
    }
    cout << "a: " << aCnt << '\n'
         << "e: " << eCnt << '\n'
         << "i: " << iCnt << '\n'
         << "o: " << oCnt << '\n'
         << "u: " << uCnt << endl;
如果表达式与其中一个 case 标号的值匹配,则程序将从该标号后面的第一个语句开始依次执行各个语句,知道 switch结束或者遇到break语句为止!
尽管没有严格要求在switch结构的最后一个 标号之后指定break语句,但是,为了安全起见,最好在每个标号后面提供一个break语句,即使是最后一个标号也一样。

default标号

如果所有的case标号与switch表达式的值都不匹配,并且default标号存在,则执行default标号后面的语句。

switch(ch)
{
     case 'a':
         ++aCnt;
         break;
     default:
         ++otherCnt;
          break;
}
哪怕没有语句要在 default 标号下执行,定义 default 标号仍然是有用的。定义 default 标号是为了告诉读者,表明这种情况已经考虑到了,只是没什么要执行的!
for语句

for(初始化语句;条件循环;表达式)

......

初始化语句,条件循环,表达式中的任何一个或者全部都可以省略。

dowhile语句

while语句不同,dowhile保证循环体至少执行一次,而且dowhile语句是以;分号结束

如果把变量定义在了do内部,那么该变量的作用域就被限制在while前的花括号之前了

    do
    {
        int ival = 1;
    }
    while (ival == 1);//error

break语句

break语句用于结束最近的whiledowhileforswitch语句,并将程序的执行权传递给紧接在被终止语句之后的语句。

break出现在循环外或者switch外会导致编译时错误。

continue语句
continue 语句导致最近的循环语句的当次迭代提前结束

goto语句

    从上世纪60年代开始,就不主张使用goto语句了。goto语句使得跟踪程序控制流程变得异常困难,并且使得程序难以理解。所有使用goto的程序都可以改写成为不用goto的语句,因此也就没有必要使用goto语句了!

	goto label;
    //...
label:
	//...

try块和异常处理

    在设计良好的系统中,异常是程序错误处理的一部分。当程序代码检查到无法处理的问题时,异常处理就特别有用。在这些情况下,检测出问题的那部分程序需要一种方法把控制权转到可以处理这个问题的那部分程序。错误检测程序还必须指出具体出现了什么问题,并且可能需要提供一些附加信息。

异常机制提供程序中错误检测与错误处理部分之间的通信。C++的异常处理中包括:

   1.throw表达式,错误检测部分使用这种表达式来说明遇到了不可处理的错误。可以说,throw引发了异常条件。

   2.try,错误处理部分使用它来处理异常。try语句块以try关键字开始,并以一个或多个catch子句结束。在try块中执行的代码所抛出(throw)的异常,通常会被其中一个catch子句处理。由于它们“处理”异常,catch子句也称为处理代码。

   3.由标准库定义的一组异常类,用来在throw和相应的catch之间传递有关的错误信息。

throw表达式

   系统通过throw表达式抛出异常,throw表达式的类型决定了所抛出异常的类型。

    Sales_item item1,item2;
    cin >> item1 >> item2;

    if (!item1.same_isbn(item2))
    {
        //需要包含stdexcept头文件
        throw runtime_error("Data must refer to same ISBN");
    }
    else
    {
        cout << item1 + item2 << endl;
    }

try

    一旦catch子句执行结束,程序流程立即继续执行紧随最后一个catch子句后的语句。

    在try块中声明的变量,包括catch子句中声明的变量,不能在try外面使用。

    Sales_item item1,item2;

    while (cin >> item1 >> item2)
    {
        try
        {
            if (!item1.same_isbn(item2))
            {
                throw runtime_error("Data must refer to same ISBN");
            }
        }
        catch (runtime_error err)
        {
            cout << err.what()
                 << "\nTry Again? Enter y or n" << endl;
            char c;
            cin >> c;
            if (cin && c == 'n')
            {
                break;
            }
        }

        cout << item1 + item2 << endl;
    }
在执行 try 块代码的过程中,如果在 try 块中的代码抛出 runtime_error 类型的异常,则处理这类异常的动作在 catch 后面的块语句中定义。






  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值