4.4 switch语句

从上面的介绍可知,利用嵌套的if语句结构可以处理实际问题中常常遇到的多分支选择结构。但同时也应看到如果分支较多,则嵌套的if语句层数较多,程序冗长,可读性降低,而且编写程序容易出错。对此C语言提供的switch语句,可以很方便、直接地处理多分支选择。switch语句被称为多分支选择语句,也称为开关语句,其一般形式为:

            switch(表达式)
            {
            case常量表达式1: 语句1;
            case常量表达式2: 语句2;
            ……
            case常量表达式n: 语句n;
            default: 语句n+1;
            }

该语句的语义为,程序执行时首先计算表达式的值,并由第一个case分支开始将其逐个与case后的常量表达式值作比较,当表达式的值与某个case分支的常量表达式值相等时,则执行case后的内嵌语句,然后不再进行判断,继续执行后面case分支的内嵌语句,直到遇到break语句(关于break语句,将在第5章介绍)或者遇到语句的右花括号为止。当表达式的值与所有case分支的常量表达式均不相同时,则执行default后的内嵌语句。

【例4.8】 编写程序,输入1~10之间的任意一个数字,输出相应的英文单词。

分析:定义一个整型变量a接收从键盘输入的数字,并作为switch语句的表达式,设计10个case子句,其常量表达式分别为1~10,对应的case子句为输出相应的英文单词的语句。程序代码如下:

            #include"stdio.h"
            main()
            {
              int a;
              printf("input integer number:");
              scanf("%d",&a);
              switch(a)
              {
                case 1:printf("One\n");
                case 2:printf("Two\n");
                case 3:printf("Three\n");
                case 4:printf("Four\n");
                case 5:printf("Frive\n");
                case 6:printf("Six\n");
                case 7:printf("Seven\n");
                case 8:printf("Eight\n");
                case 9:printf("Nine\n");
                case 10:printf("Ten\n");
                default:printf("error\n");
                }
            }

程序运行结果如下:

            输入:8
            输出:Eight
                      Nine
                      Ten
                      error

本来要求输入一个数字,只输出对应的英文单词,但是当输入8之后,却执行了case 8及以后的所有内嵌语句,输出了Eight及以后的所有单词,这当然是不希望的。为什么会出现这种情况呢? 这恰恰说明了switch语句的一个特点。在switch语句中,case 常量表达式只相当于一个语句标号,表达式的值和某个语句标号(常量表达式的值)相等则转向该标号执行其后的内嵌语句,但不能在执行完该标号的内嵌语句后自动跳出整个switch结构,所以出现了继续执行所有后面case内嵌语句的情况。这是与前面介绍的if语句完全不同的,应特别注意。为了避免上述情况的发生,可以使用C语言提供的break语句适时跳出switch结构。break语句只有关键字break,没有参数,在第5章将详细介绍。修改例4.9的程序,在每一个case语句之后增加break语句,使之执行每一个case子句后均可跳出switch结构,从而避免输出不应有的结果。程序代码如下:

            #include"stdio.h"
            main()
            {
              int a;
              printf("input integer number:");
              scanf("%d",&a);
              switch(a)
              {
                case 1:printf("One\n");break;
                case 2:printf("Two\n");break;
                case 3:printf("Three\n");break;
                case 4:printf("Four\n");break;
                case 5:printf("Frive\n");break;
                case 6:printf("Six\n");break;
                case 7:printf("Seven\n");break;
                case 8:printf("Eight\n");break;
                case 9:printf("Nine\n");break;
                case 10:printf("Ten\n");break;
                default:printf("error\n");
                }
            }

在使用switch语句时还应该注意以下几点:

① 在case后的各个常量表达式的值不能相同,否则会出现错误。

② 在case后,允许有多条语句,可以不用“{ }”括起来,也允许没有语句。

③ 各case和default子句的先后顺序可以变动,而不会影响程序执行结果,且default子句可以省略不用。

④ 从语法上来说,switch语句也是一条完整的控制语句。

⑤ break语句的作用是使控制立即跳出switch结构,恰当地使用break语句,可以控制一段程序的执行入口和出口点。例如:

            switch(i)
              {
                case 1: 语句1;
                case 2: 语句2;break;
                case 3: 语句3;
                case 4: 语句4;
                case 5: 语句5;break;
                defau1t: 语句6;
            }

当i=1时,从语句1执行到语句2;i=2时,执行语句2;i=3时,从语句3执行到语句5;i=4时,从语句4执行到语句5;i=5时,执行语句5;i为其他值时,执行语句6。所以根据i的值,可以实现从不同的入口开始执行一段代码后从不同的出口退出,以满足程序的要求。