现在的位置: 首页 > 综合 > 正文

C++菜鸟常见错误整理(第八天)

2014年01月30日 ⁄ 综合 ⁄ 共 1624字 ⁄ 字号 评论关闭

 本人目前还是学生,能力有限,有不足或者错误的地方欢迎大家指正,谢谢大家!

1、if语句,垂悬else

     看如下代码

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

       if 语句都普通存在着潜在的二义性。这种情况往往称为悬垂 else 问题,产生于一个语句包含的 if 子句多于

 else 子句时:对于每一个 else,究竟它们归属哪个 if 语句?

        在上述的代码中,缩进的用法表明 else 应该与外层的 if 子句匹配。然而,C++中悬垂 else 问题带来的

二义性,通过将 else 匹配给最后出现的尚未匹配的if 子句来解决。

        有些编程风格建议总是在 if 后面使用花括号。

2、switch case语句case的省略问题

假设要统计五个元音在文本里分别出现的次数

直接使用 switch 语句解决上述问题:
        char ch;
        int aCnt = 0, eCnt = 0, iCnt = 0,oCnt = 0, uCnt = 0;
        while (cin >> ch) {
        switch (ch) {
        case 'a':    ++aCnt;    break;
        case 'e':    ++eCnt;    break;
        case 'i':     ++iCnt;     break;
        case 'o':    ++oCnt;    break;
        case 'u':    ++uCnt;    break;     }
      }

省略case,上述代码可以这么写

      switch (ch)  {

      case 'a': case 'e': case 'i': case 'o': case 'u':

      ++vowelCnt;    break;      }

       比较少见的用法是,为了执行某个 case 的代码后继续执行下一个 case 的代码,故意省略 break 语句。

       故意省略 case 后面的 break 语句是很罕见的,因此应该提供一些注释说明其逻辑。

        switch(int ival = get_response())

      在这个例子中,ival 被初始化为 get_response 函数的调用结果,其值将要与每个 case 标号作比较。

变量 ival 始终存在于整个 switch 语句中,在 switch结构外面该变量就不再有效了。

3、default 标号

    default 标号提供了相当于 else 子句的功能。如果所有的 case 标号与switch 表达式的值都不匹配,并且

default 标号存在,则执行 default 标号后面的语句。

      例如,在上述例子中添加一个计数器 otherCnt 统计读入多少个辅音字母,为 switch 结构增加 default 标号,

其标志的分支实现 otherCnt 的自增:

     switch (ch) {

    case 'a':   ++aCnt;   break;

   default:  ++otherCnt;  break;  } 

   在这个码中,如果 ch 不是元音,程序流程将执行 default 标号的相关语句,使 otherCnt 的值加 1。哪怕没有

语句要在 default 标号下执行,定义default 标号仍然是有用的。定义 default 标号是为了告诉它的读者,表明这种

情况已经考虑到了,只是没什么要执行的。

    一个标号不能独立存在,它必须位于语句之前。如果 switch 结构以 default 标号结束,而且 default 分支不需要

完成任何任务,那么该标号后面必须有一个空语句。

       今天就到这里,有不足的地方还请指正,谢谢大家!


抱歉!评论已关闭.