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
是字母 i
, switch
语句会定位到标签为 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
语句进行重定向。 expression
和 case
标签都必须是整数值(包括 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
的值是 1
或 2
,打印第1条消息;如果 choice
的值是 3
,打印第2条和第3条消息(程序继续执行后续的语句,因为 case 3
后面没有 break
语句);如果 choice
的值是4,则打印第3条消息;如果 choice
的值是其他值只打印最后一条消息。