当前位置:嗨网首页>书籍在线阅读

22-多重标签

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

7.7.3 多重标签

如程序清单7.12所示,可以在 switch 语句中使用多重 case 标签。

程序清单7.12  vowels.c 程序

// vowels.c -- 使用多重标签
#include <stdio.h>
int main(void)
{
     char ch;
     int a_ct, e_ct, i_ct, o_ct, u_ct;
     a_ct = e_ct = i_ct = o_ct = u_ct = 0;
     printf("Enter some text; enter # to quit.\n");
     while ((ch = getchar()) != '#')
     {
          switch (ch)
          {
               case 'a':
               case 'A':  a_ct++;
                          break;
               case 'e':
               case 'E':  e_ct++;
                          break;
               case 'i':
               case 'I':  i_ct++;
                          break;
               case 'o':
               case 'O':  o_ct++;
                          break;
               case 'u':
               case 'U':  u_ct++;
                          break;
               default:   break;
          }                       // switch结束
     }                            // while循环结束
     printf("number of vowels:   A    E    I    O    U\n");
     printf("                 %4d %4d %4d %4d %4d\n",
               a_ct, e_ct, i_ct, o_ct, u_ct);
     return 0;
}

假设如果 ch 是字母 iswitch 语句会定位到标签为 case 'i' : 的位置。由于该标签没有关联 break 语句,所以程序流直接执行下一条语句,即 i_ct++; 。如果 ch 是字母 I ,程序流会直接定位到 case 'I' : 。本质上,两个标签都指的是相同的语句。

严格地说, case 'U'break 语句并不需要。因为即使删除这条 break 语句,程序流会接着执行 switch 中的下一条语句,即 default : break; 。所以,可以把 case 'U'break 语句去掉以缩短代码。但是从另一方面看,保留这条 break 语句可以防止以后在添加新的 case (例如,把 y 作为元音)时遗漏 break 语句。

下面是该程序的运行示例:

Enter some text; enter # to quit.
I see under the overseer.#
number of vowels:     A    E    I    O    U
                      0    7    1    1    1

在该例中,如果使用 ctype.h 系列的 toupper() 函数(参见表7.2)可以避免使用多重标签,在进行测试之前就把字母转换成大写字母:

while ((ch = getchar()) != '#')
{
     ch = toupper(ch);
     switch (ch)
     {
          case 'A': a_ct++;
                    break;
          case 'E': e_ct++;
                    break;
          case 'I': i_ct++;
                    break;
          case 'O': o_ct++;
                    break;
          case 'U': u_ct++;
                    break;
          default: break;
     } // switch结束
} // while循环结束

或者,也可以先不转换 ch ,把 toupper(ch) 放进 switch 的测试条件中: switch(toupper(ch))

小结:带多重选择的 switch 语句

关键字: switch

一般注解:

程序根据 expression 的值跳转至相应的 case 标签处。然后,执行剩下的所有语句,除非执行到 break 语句进行重定向。 expressioncase 标签都必须是整数值(包括 char 类型),标签必须是常量或完全由常量组成的表达式。如果没有 case 标签与 expression 的值匹配,控制则转至标有 default 的语句(如果有的话);否则,将转至执行紧跟在 switch 语句后面的语句。

形式:

switch ( expression )
{
     case label1 : statement1//使用break跳出switch
     case label2 : statement2
     default     : statement3
}

可以有多个标签语句, default 语句可选。

示例:

switch (choice)
     {
     case 1 :
     case 2 : printf("Darn tootin'!\n"); break;
     case 3 : printf("Quite right!\n");
     case 4 : printf("Good show!\n"); break;
     default: printf("Have a nice day.\n");
     }

如果 choice 的值是 12 ,打印第1条消息;如果 choice 的值是 3 ,打印第2条和第3条消息(程序继续执行后续的语句,因为 case 3 后面没有 break 语句);如果 choice 的值是4,则打印第3条消息;如果 choice 的值是其他值只打印最后一条消息。