文档章节

C Primer Plus 第7章 C控制语句:分支和跳转 7.7 多重选择switch break

idreamo
 idreamo
发布于 2016/06/21 05:59
字数 1224
阅读 39
收藏 1

程序清单7.11  animals.c程序

#include <stdio.h>
#include <ctype.h>
int main(void)
{
    char ch ;
    printf("Give me a letter of the alphabet,and I will give ");
    printf("an animal name \n beginning with ghat letter.\n");
    printf("Please type in a letter; type # to end my act.\n");
    while((ch=getchar())!='#')
    {
        if(ch=='\n')
            continue;
        if(islower(ch))/*只识别小写字母*/
            switch(ch)
        {
        case 'a':
            printf("argali,a wild sheep of Asia\n");
            break;
        case 'b':
            printf("babirusa, a wild pig of Malay\n");
            break;
        case 'c':
            printf("coati,racoonlike mammal\n");
            break;
        case 'd':
            printf("desman,aquatic,molelike cretter\n");
            break;
        case 'e':
            printf("echidna,the spiny anteater\n");
            break;
        case 'f':
            printf("fisher,brownish marten\n");
            break;
        default:
            printf("That's a stumper!\n");
        }/*switch语句结束*/
        else
            printf("I recognize only lowercase letter.\n");
        while(getchar()!='\n')
            continue;  /*跳过输入行的剩余部分*/
        printf("Please type another letter of a #.\n");
                        /*while 循环结束*/
    }
    printf("Bye!\n");
    return 0;
}

7.7.1 使用switch语句

紧跟在switch后的圆括号里的表达式被求值。在这里,它就是刚刚输入给ch的值。然后程序扫描标签列表,直到投过到一个与该值相匹配的标签。然后程序跳到那一行。要是没有相匹配的标签怎么办?如果有被标记为default:的标签行,程序就跳到该 行;否则,程序继续处理跟在switch语句之后 的语句。

break语句有什么作用呢?它导致程序脱离switch语句,跳到switch之后的下一条语句。如果没有break语句,从相匹配的标签到switch末尾的每一条语句都将被处理。

顺便提一下,break语句用于循环和switch中,而continue仅用于循环。但是,如果switch语句位于一个循环中,则可以把continue用于switch语句的一部分。在这种情况下,就像在其他的循环中一样,continue导致程序跟过该循环的其余部分,其中包括switch的其余部分。

圆括号中的switch判断表达式应该具有整数值(包括char类型)。case标签必须是整型(包括char)常量或者整数常量表达式。不能用变量作为case的标签。因而switch结构是这样的:

switch(integer expression)

    {

    case constant1:

        statements  --可选

    case constant2:

        statements  --可选

    deafult:

        statements  --可选

}

7.7.2  只读取一行的首字符

animals.c的另一个特点 是它读取输入的方法。在运行示例中您可能已经注意到,当输入dab时,仅仅处理了第一个字符。这种特性在期望响应单字符的交互式程序中通常很合适。产生这种动作的是下面的代码:

while(getchar()!='\n')

    continue;    /*跳过输入行的剩余部分*/

这个循环从输入读取字符,直到出现由回车键产生的换行字符。注意,函数返回值 没有被赋给ch,因此字符 仅被读取并丢弃。因为最后一个被丢弃的字符是换行符,所以下一个读入的字符是下行的首字符。在外层while循环中,由getchar()读取它并将其值赋给ch。

7.7.3  多重标签

如程序7.12所示,可以对一个给定的语句使用多重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 # go 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,程序流就直接定位到那条语句。本质上两个标签都指向同一个语句。

在这个特例中,可以通过使用ctype.h系列中的toupper()函数在进行判断之前将所有的字符转换为大写字母来避免使用多标签。如switch(toupper(ch)),这样,标签中只使用对应的大写字母即可。

7.7.4  switch 和 if else

什么时候该使用switch,而什么时候又该使用if else结构呢?通常是没有选择的。如果选择是基于求一个浮点型变量或表达式的值,就不能使用switch。如果变量必须落入某一个范围,也不能很方便的使用switch。这样会更简单:while (i<1000 && i>2)。

然而,如果可以使用switch,程序通常会运行的稍快点,而且占据较少的代码。

© 著作权归作者所有

idreamo
粉丝 18
博文 139
码字总数 224743
作品 0
青岛
产品经理
私信 提问
C Primer Plus 第7章 C控制语句:分支和跳转 本章概要

在本章中您将学习到以下内容: *关键字 if / else / switch / continue / break / case / default / goto *运算符 && || ?: *函数: getchar() / putchar() 以及ctype.h系列 *怎样使用if和i...

idreamo
2016/06/12
47
0
《Java从小白到大牛》之第7章 控制语句

《Java从小白到大牛》纸质版已经上架了!!! 程序设计中的控制语句有三种,即顺序、分支和循环语句。Java程序通过控制语句来管理程序流,完成一定的任务。程序流是由若干个语句组成的,语句...

tony关东升
2018/06/25
0
0
c语言基础学习04_条件判断语句

============================================================================= 涉及到的知识点有:程序的三种结构、条件分支语句、循环语句、求自然数的和、 求100到999之间所有的水仙花...

黑泽明军
2017/12/25
0
0
C语言再学习--关键字

C语言一共有32个关键字,如下表所示: 关键字 说明 auto 声明自动变量 short 声明短整型变量或函数 int 声明整型变量或函数 long 声明长整型变量或函数 float 声明浮点型变量或函数 double 声...

qq_29350001
2016/11/03
0
0
C Primer Plus 第11章 11.7 ctype.h字符函数和字符串

第7章“C控制语句 分支和跳转”介绍了ctype.h系列字符相关的函数。这些函数不能被 应用于整个字符串,但是可以被应用于字符串中的个别字符。程序清单11.26定义了一个函数,它把toupper( )函数...

idreamo
2016/08/27
52
0

没有更多内容

加载失败,请刷新页面

加载更多

怎样在磁盘上查找MySQL表的大小?这里有答案

我想知道 MySQL 表在磁盘上占用多少空间,但看起来很琐碎。不应该在 INFORMATION_SCHEMA.TABLES 中提供这些信息吗?没那么简单! 我想知道 MySQL 表在磁盘上占用多少空间,但看起来很琐碎。不应...

Linux就该这么学
42分钟前
5
0
Redis

一、Redis支持的几种数据类型:字符串、List、SET、HASH、ZSET 二、Redis的缓存技术主要是为了降低关系数据库的负载并减少网站成本 三、在Redis里面,被MULTI命令和EXEC命令包围的所有命令会...

BobwithB
44分钟前
4
0
MongoDB基础之入门

MongoDB基础之入门 一、MONGODB简介 MongoDB由C/C++开发,是一种强大、灵活、可扩展的数据存储方式。它扩展了关系型数据库的众多有用功能,例如:辅助索引、范围查询和排序。MongoDB还内置了...

星汉
46分钟前
7
0
c++ 神奇的赋值用法

c++ 神奇的赋值用法(第8章)

天王盖地虎626
今天
5
0
Jquery操作UI之设置字体大小

先获取字体大小,进行处理。再将修改的值保存。 slice() 方法可从已有的数组中返回选定的元素。 arrayObject.slice(start,end)。 start 必需。规定从何处开始选取。如果是负数,那么它规定从...

前端老手
今天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部