Chinaunix首页 | 论坛 | 博客
  • 博客访问: 19268375
  • 博文数量: 7460
  • 博客积分: 10434
  • 博客等级: 上将
  • 技术积分: 78178
  • 用 户 组: 普通用户
  • 注册时间: 2008-03-02 22:54
文章分类

全部博文(7460)

文章存档

2011年(1)

2009年(669)

2008年(6790)

分类: C/C++

2008-03-20 18:55:44

来源: 作者:Antigloss 等级:强烈推荐
发布于2007-07-19 09:00 被读2161次 【字体: 】

    当我们需要进行二选一的分支时,使用 if...else... 是个很好的选择。然而,有时我们需要进行多选一的分支。虽然可以使用 if...else if...else...,但是这往往不太直观。此时,使用 switch 语句往往会更简便精炼。下面我们先来看一个使用 switch 语句的例子:

        /*--------------------------------------------------------------
         | 作者: Antigloss @ @ 蚂蚁的 C/C++ 标准编程
         | 
         | 功能: 演示 switch 语句,统计一行字符中元音字母的个数
          -------------------------------------------------------------*/

        #include <stdio.h>
        #include <ctype.h>

        int main(void)
        {
            int ch;  /* 注意,ch 一定要定义为 int 类型。参考 */
            unsigned apple     = 0,
                     egg       = 0,
                     icecream  = 0,
                     orange    = 0,
                     umbrella  = 0,
                     other     = 0;

            printf("Please type in a sentence:\n");
            while ( (ch = getchar()) != '\n' )
            {
                switch ( tolower(ch) )  /* tolower 返回 ch 对应的小写字母的值 */
                {
                    case 'a' :
                        ++apple;
                        break;
                    case 'e' :
                        ++egg;
                        break;
                    case 'i' :
                        ++icecream;
                        break;
                    case 'o' :
                        ++orange;
                        break;
                    case 'u' :
                        ++umbrella;
                        break;
                    default :
                        ++other;
                        break;  /* 此行不写也没啥关系,习惯上还是写上的好 */
                }
            }

            printf("a    : %u\n"
                   "e    : %u\n"
                   "i    : %u\n"
                   "o    : %u\n"
                   "u    : %u\n"
                   "other: %u\n",
                   apple,
                   egg,
                   icecream,
                   orange,
                   umbrella,
                   other);

            return 0;
        }

    在往下看之前,请先想一下该程序是做什么用的,然后编译运行,看看结果和你想的是否一致。如果一致,那可以说你已经基本上学会了 switch 语句。以下是该程序运行的结果:

        Please type in a sentence:
        Welcome to . Please enjoy yourself here.
        a    : 1
        e    : 8
        i    : 0
        o    : 4
        u    : 1
        other: 42

    下面我们讲解一下 switch 语句的用法。switch 语句的结构如下所示:

        switch (整型表达式)
        {
            case 整型常量1:
                一系列语句    // 可有可无
            case 整型常量2:
                一系列语句    // 可有可无
            case 整型常量3:
                一系列语句    // 可有可无
            // ... ...
            default :         // 可有可无
                一系列语句    // 可有可无

        }

其中,“整型表达式”指的是其值为整数类型(包括 char)的表达式;case 标签中的“整型常量”必须是整数类型(当然也包括 char)的常量或者常量表达式(只包含整型常量的表达式)。case 标签中不能使用变量!C99 标准规定,一个 switch 里至少可以用 1023 个 case 标签,而且不包括 switch 语句中的嵌套 switch 语句的 case 标签。原文如下:


 引用:

C99 - 5.2.4.1 Translation limits
1023 case labels for a switch statement (excluding those for any nested switch statements)

    下面,我们通过讲解上例的执行过程来学习 switch 语句。首先,getchar 读取用户输入的一个字符,然后该字符被赋值给 ch,接着判断 ch 是否为 '\n'(也就是判断是否已经读完一行),如果 ch 为 '\n',则退出循环。以我们的输入为例:


 引用:

Welcome to . Please enjoy yourself here.


while 循环第一次读到 'W',然后进入循环体执行 switch 语句。switch 后面被括号括住的整型表达式会先被运算,本例中就是先调用 tolower 函数。tolower(ch) 的作用是返回 ch 对应的小写字母的值。如果 ch 不是字母或者本身就是小写字母,则返回的是 ch 本身的值。故此,此时表达式的值为 'w'。然后,程序开始扫描 case 标签(本例的 case 'a':、case 'e': 等等),直到在“整型常量”中找到一个和“整型表达式”的值匹配的值为止(本例是在 'a'、'e' 等等中找和 'w' 匹配的值)。当程序找到一个匹配的值后,就会执行该标签下的一系列语句。如果在 case 标签中找不到任何匹配的值,并且 switch 语句中有 default 标签,那么程序就会执行 default 标签下的一系列语句;否则,程序将退出 switch 语句,然后执行 switch 语句后面的语句。本例在 case 标签中找不到和 'w' 匹配的值,而且 switch 语句中有 default 标签,所以


 引用:


++other;
break;  /* 此行不写也没啥关系,习惯上还是写上的好 */


会被执行。

    你可能会觉得很奇怪——为什么每个标签后都要写上 break 语句呢,它在这里是干什么用的?其实,它在这里的作用是跳出 switch 语句,转而执行 switch 语句后面的语句。如下图所示(假设 number 的值为 2):

如果不写 break 语句,则从匹配的标签开始,直到 switch 语句结束前的语句都会被执行。例如,如果把上例中的 break 语句都去掉,重新编译后,在运行时输入 I,则会得到如下结果:

        Please type in a sentence:
        I
        a    : 0
        e    : 0
        i    : 1
        o    : 1
        u    : 1
        other: 1

由此可见,“case 'i' :”后面,switch 语句结束前的所有语句都被执行了一遍。因此,千万别忘了写上 break 语句,它非常重要!

    再回到我们前面的例子,while 循环第二次读到 'e',和“case 'e' :”匹配,则执行


 引用:


++egg;
break;


while 循环第三次读到 'l'……(略)

    本例使用 tolower 函数(需包含头文件 ctype.h)是为了能统计大写的元音字母。当然,不用 tolower 也能达到统计大写元音字母的目的,只要为对应的大写字母添加一个标签即可。例如:

        switch ( ch )
        {
            case 'a' :
            case 'A' :
                ++apple;
                break;
            case 'e' :
            case 'E' :
                ++egg;
                break;
        ... ...

    break 语句既能用于跳出循环,也能用于跳出 switch,但 continue 语句只能作用于循环。当 switch 语句位于循环里时:

  • switch 语句中的 break 语句只跳出 switch 语句,而不会更进一步跳出包含该 switch 语句的循环。
  • switch 语句中的 continue 语句将致使程序跳过循环中余下的语句(当然也包括 switch 语句中余下的语句),转而判断循环条件是否仍然成立,然后选择是否再次进入循环体。

参考资料:C Primer 5th Edition
          C99 标准 - 6.8.4.2 The switch statement

本文版权归 以及 作者 Antigloss 共同所有,转载请注明原作者和出处。谢谢。

阅读(656) | 评论(0) | 转发(0) |
0

上一篇:52. continue 和 break

下一篇:54. goto 语句

给主人留下些什么吧!~~