首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

Switch语句用法

Switch语句用法


当我们需要进行二选一的分支时,使用 If...Else... 是个很好的选择。然而,有时我们需要进行多选一的分支。虽然可以使用 If...Else If...Else...,但是这往往不太直观。此时,使用 Switch 语句往往会更简便精炼。下面我们先来看一个使用 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:
");

            While ( (Ch = Getchar()) != ''
'' )

            {

                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
"

                   "E    : %U
"

                   "I    : %U
"

                   "O    : %U
"

                   "U    : %U
"

                   "Other: %U
",

                   Apple,

                   Egg,

                   Icecream,

                   Orange,

                   Umbrella,

                   Other);

            Return 0;

        }

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

        Please Type In A Sentence:

        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 是否为 ''
''(也就是判断是否已经读完一行),如果 Ch 为 ''
'',则退出循环。以我们的输入为例:


















引用:













Welcome To Http://Www.Dz3w.Com. 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 语句中余下的语句),转而判断循环条件是否仍然成立,然后选择是否再次进入循环体。

返回列表