zoukankan      html  css  js  c++  java
  • 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;
    }

     

    运行结果:

  • 相关阅读:
    BC高精确度函数使用。
    thinkPHP中_initialize方法实例分析
    MySQL中concat函数
    使用docker打造spark集群
    zhihu spark集群,书籍,论文
    Windows下安装使用curl命令
    数据可视化的优秀入门书籍有哪些,D3.js 学习资源汇总
    2015互联网+影响力报告发布
    The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path
    centos linux中怎么查看和修改计算机名/etc/sysconfig/network
  • 原文地址:https://www.cnblogs.com/new0801/p/6177145.html
Copyright © 2011-2022 走看看