20201026-成信大-C语言程序设计-20201学期《C语言程序设计B》C-关于switch的执行顺序

20201026-成信大-C语言程序设计-20201学期《C语言程序设计B》C-关于switch的执行顺序

经验:编程一定要按规范来写。
注意:
很多编程语言,都提供的有这样的分支结构,但要注意差别
这里涉及到的有java的,也有C的

核心参考

switch(expression){
    case value :
       //语句
       break; //可选
    case value :
       //语句
       break; //可选
    //你可以有任意数量的case语句
    default : //可选
       //语句
}

switch语句有如下规则:

  • switch语句中的变量类型只能为byte、short、int或者char。
  • switch语句可以拥有多个case语句。每个case后面跟一个要比较的值和冒号。
  • case语句中的值的数据类型必须与变量的数据类型相同,而且只能是常量或者字面常量。
  • 当变量的值与case语句的值相等时,那么case语句之后的语句开始执行,直到break语句出现才会跳出switch语句。
  • 当遇到break语句时,switch语句终止。程序跳转到switch语句后面的语句执行。case语句不必须要包含break语句如果没有break语句出现,程序会继续执行下一条case语句,直到出现break语句
  • switch语句可以包含一个default分支,该分支必须是switch语句的最后一个分支
  • default在没有case语句的值和变量值相等的时候执行。default分支不需要break语句。

正常写法,case按顺序来匹配,加上break,default置尾

int x = 2;
switch(x){
    case 1:System.out.println("case 1");
        break;
    case 2:System.out.println("case 2");
        break;
    case 3:System.out.println("case 3");
        break;
    default:System.out.println("Default");
        break;
}

程序输出:

case 2

异常写法,新手易入坑

int x = 2;
switch(x){
    case 1:System.out.println("case 1");
    case 2:System.out.println("case 2");
    case 3:System.out.println("case 3");
    default:System.out.println("Default");
}

程序输出

case 2
case 3
default
可以理解,一旦找到切入点,就可切入语句,从上到下按顺序执行下去,直到遇到break,才跳出

扭曲写法,邪门格式,无能考官直接卡死新手

int x = 4;
switch(x){
    default:System.out.println("Default");
    case 1:System.out.println("case 1");
    case 2:System.out.println("case 2");
    case 3:System.out.println("case 3");
}

程序输出

default
case 1
case 2
case 3
当switch中匹配不到切入点时,进入default,然后,邪门的地方出现了,切入之后,也会按照从上到下的顺序执行

表示难以理解,分析一下switch内执行过程:

  • 拿到括号中的值,然后从case中逐一匹配,匹配到的话就切入进去,从上到下执行(不管语句是case下的还是default下),直到遇到break;
  • 匹配不到case,如果有default,就进入default,然后按顺序从上到下执行,知道遇到break或结束;

闲到无能为力啊

/* 
    将default置于switch的开头
    闲得蛋疼的程序员啊
        关键是他还要在中间加上一个break;
        这种程序员如果混进了团队,一定要打死,往死里打;
        如果面试官这么整,吐他口水,他不配当面试官;
        如果老师这样出题,那你只有入坑蹲好,不要乱动;

 */
#include <stdio.h>

int main(void)
{
    int x = 4;
    switch (x)
    {
    default:
        printf("\nDefault");
    case 1:
        printf("\ncase 1");
    case 2:
        printf("\ncase 2");
        break;
    case 3:
        printf("\ncase 3");
    }
}

其它变态示例

常规顺序,无break,default每次都要执行

/*
    1. 没有break语句,顺序从上往下匹配执行
    2. 显然,每一次default都会执行
    3. i从1增长到4,会有四个5累加到a,即20
    4. i从1增长到4,其中1,2,3会有三次3累加,一次2累加,即11
    5. 结果:31

    坑死无数新手啊。。。。。
*/
#include <stdio.h>

int main(void)
{

    int a = 0, i;

    for (i = 1; i < 5; i++)
    {
        switch (i)
        {
        case 0:
        case 3:
            a += 2;
        case 1:
        case 2:
            a += 3;
        default:
            a += 5;
        }
    }
    printf("%d\n", a);
}

乱用default,不使用break,邪恶的代码,在工程团队中将被团队直接处死的程序员写的代码

/* 
    1. 没有break语句
        default乱跳:顺序从上往下匹配执行
        只要default执行了,它之后的群魔case也会搭车再执行一次【邪恶啊】

    2. 显然,每一次default都会执行
        显然,case 0 每一次都会搭default的车执行

    3. 'china'里的字符,无论匹配不匹配,default和case 0 都会执行
    4.  结果:5,5

    坑死队友、新手啊。。。。。
*/

#include <stdio.h>

int main(void)
{
    int v1 = 0, v2 = 0;
    char ch;

    while ((ch = getchar()) != '#')
    {
        switch (ch)
        {
        case 'a':
        case 'h':
        default:
            v1++;
        case '0':
            v2++;
        }
    }
    printf("%d,%d\n", v1, v2);
}

常规用法,但加入更多的循环、自增自减等运算,转移视线

/* 
    常规写法
    1. 再加上++等运算,就让新手抓瞎了
    2. i取9 10 11,最后i增长为12
    3. i对10取商后,取的是0,1,1
        其中只有0匹配一次,执行一次,m,n增1
    4. i的三次取值,default因为有break在前
        只会在1,1匹配不到时执行两次,k,n增2
    5. 最终m,n,k为1,3,2

	新手易入坑
 */

#include <stdio.h>

int main(void)
{
    int i, m = 0, n = 0, k = 0;

    for (i = 9; i <= 11; i++)
    {
        switch (i / 10)
        {
        case 0:
            m++;
            n++;
            break;
        case 10:
            n++;
            break;
        default:
            k++;
            n++;
        }
    }
    printf("%d %d %d\n", m, n, k);
}

后记:
事实证明,如果不认真学习switch,最容易栽在学校里的那场期末考试上啊。
这样变态的题,只有学校出得出来。公司不会搞出这样的题来招人。【有些时候并不是命题者无能,而是学生的学习越来越会参考书本之外的内容,多百度,多看CSDN,总会有新的收获,但总有人懒,不会看,嘻嘻。。。。题库不是普通人搞出来的,但普通人肯定会去用它】
另外,就是二级等级考试里【其实也是学校的人出的题】会搞出这样的妖蛾子。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值