C语言入门(11)——switch分支语句

C语言提供了一种用于多分支选择的switch语句, 其一般形式为:

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


它的意思是:计算表达式的值。并逐个与其后的常量表达式值相比较,当表达式的值与某个常量表达式的值相等时,即执行其后的语句,然后不再进行判断,继续执行后面所有case后的语句。如表达式的值与所有case后的常量表达式均不相同时,则执行default后的语句。处理流程图如下:

使用switch语句的规则是:

1、switch语句的判断条件可以接受int,byte,char,short,枚举,不能接受其他类型。

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

3、在case后,允许有多个语句,可以不用{}括起来。

4、各case和default子句的先后顺序可以变动,而不会影响程序执行结果。

5、default就是如果没有符合的case就执行它,default并不是必须的。

6、在都没有break 语句的情况下:首先会在所有的case 语句中,寻找满足条件的语句。如果找到,会从该语句顺序向下执行每个语句;若找不到,会从第一段开始,向下顺序执行每一段语句。

 7、在有break 语句的情况下:找到一个满足条件的case 语句执行,若找不到,会执行default 的语句。

比如下面的例子:

#include <stdio.h>
int main(void)
{
    inta;
    printf("请输入一个整型数字:
");
    scanf("%d",&a);
    switch(a)
    {
        case1:
            printf("Monday
");
        case2:
            printf("Tuesday
");
        case3:
            printf("Wednesday
");
        case4:
            printf("Thursday
");
        case5:
            printf("Friday
");
        case6:
            printf("Saturday
");
        case7:
            printf("Sunday
");
        default:
            printf("输入错误
");
    }
    system("pause");
    return0;
}


运行结果:

本程序是要求输入一个数字,输出一个英文单词。但是当输入3之后,却执行了case3以及以后的所有语句,输出了Wednesday 及以后的所有单词。这当然是不希望的。为什么会出现这种情况呢?这恰恰反应了switch语句的一个特点。在switch语句中,“case 常量表达式”只相当于一个语句标号,表达式的值和某标号相等则转向该标号执行,但不能在执行完该标号的语句后自动跳出整个switch 语句,所以出现了继续执行所有后面case语句的情况。这是与前面介绍的if语句完全不同的,应特别注意。

为了避免上面的情况,我们需要用到break语句,专用于跳出switch语句,break 语句只有关键字break,没有参数。在后面还将详细介绍。修改例题的程序,在每一case语句之后增加break 语句,使每一次执行之后均可跳出switch语句,从而避免输出不应有的结果。

修改后的代码:

#include <stdio.h>
int main(void)
{
    inta;
    printf("请输入一个整型数字:
");
    scanf("%d",&a);
    switch(a)
    {
        case1:
            printf("Monday
");
            break;
        case2:
            printf("Tuesday
");
            break;
        case3:
            printf("Wednesday
");
            break;
        case4:
            printf("Thursday
");
            break;
        case5:
            printf("Friday
");
            break;
        case6:
            printf("Saturday
");
            break;
        case7:
            printf("Sunday
");
            break;
        default:
            printf("输入错误
");
    }
    system("pause");
    return0;
}


执行结果:

 

可以看到运行结果正常了。

switch语句不是必不可缺的,显然可以用一组if..elseif...else if...else代替,但是一方面用switch语句会使代码更清晰,另一方面,有时候编译器会对switch语句进行整体优化,使它比等价的if/else语句所生成的目标代码效率更高。

使用switch语句要注意几点:

1、case后面跟的必须是常量表达式,因为这个值必须在编译时计算出来。

2、在C语言中,浮点型是不能精确比较相等不相等的。因此C语言规定case后面跟的常量表达式的值必须是可以精确比较的整型或字符型。

3、进入case后如果没有遇到break语句就会一直往下执行,后面其它case或default下面的语句也会被执行到,直到遇到break,或者执行到整个switch语句块的末尾。通常每个case后面都要加上break语句,但有时候故意不加break来利用这个特性

下面是使用switch语句的三种情况。

1、标准型(case后面都有break语句)

#include <stdio.h>
 
int main(void)
{
    inti= 3;
    switch(i)
    {
    case1:
        printf("%d
",1);
        break;
    case2:
        printf("%d
",2);
        break;
    case3:
        printf("%d
",3);
        break;
    default:
        printf("%s
","default");
        break;
    }
 
    system("pause");
    return0;
}

运行结果:

2、特殊型1(不是完全有break语句,可以完成一些特殊应用)

#include <stdio.h>
 
int main(void)
{
    intyear= 2014;
    intmonth= 6;
    intday;
    switch(month)
    {
    case1:
    case3:
    case5:
    case7:
    case8:
    case10:
    case12:
        day= 31;
        break;
    case2:
        day= 28;
        break;
    case4:
    case6:
    case9:
    case11:
        day= 30;
        break;
    }
    printf("%d
",day);
 
    system("pause");
    return0;
}


运行结果:

 

3、特殊型2(default的位置)

#include <stdio.h>
 
int main(void)
{
    inti= 1;
    switch(i)
    {
    case1:
        printf("%d
",1);
    default:
        printf("%s
","default");
    case2:
        printf("%d
",2);
        break;
    case3:
        printf("%d
",3);
        break;
    }
 
    system("pause");
    return0;
}

 

运行结果:

原文地址:https://www.cnblogs.com/new0801/p/6177145.html