swtich case

1.case情况 <= 3种,语句块较少

DEBUG
	switch (argc)
    {
    case 0:
        printf("case 0\n");

        break;
    case 1:
        printf("case 1\n");

        break;
    case 2:
        printf("case 2\n");

        break;
    }
    printf("HelloWorld\n");
    //直接一个一个比较跳转,中间没有代码块,这样的话匹配跳转执行的时候,如果没有break的话会继续向下执行,所以	switch case语句块之间一定要break

在这里插入图片描述

release
	switch (argc)
    {
    case 10:
        printf("case 0\n");
        break;
    case 5:
        printf("case 1\n");
        break;
    case 8:
        printf("case 2\n");
        break;
    }
    printf("HelloWorld\n");
//指令优化,在看一下是否可以代码外提优化

在这里插入图片描述

2.case情况 > 3种,且最大值-最小值<=12

Release版和debug大致相同
 	/*
 	特征
	编译器会给所有case情况做一个表
	当提供的序号大于索引时,条件不匹配直接跳转至default(因为判断语句一般为无符号,所以不考虑负数的情况)
	在索引内则查表完成跳转
 	*/
 	/*
    case值+1了,如果case值+1=0对应的下标就是0,那case值就是-1 他会把case值和下标一一对应 生成如下
    case值:-1  0   1   2   3   4   5   6   7  
    下标值: 0   1   2   3   4   5   6   7   8   
    这样一一对应,如果case值是条件是不匹配的的则对应的下标全部填默认的地址值
    012A1089 46                   inc         esi 减法
    012A108A 83 C4 04             add         esp,4
    012A108D 83 FE 08             cmp         esi,8
    012A1090 77 3E                ja          $LN18+88h (012A10D0h)
    012A1092 FF 24 B5 10 11 2A 01 jmp         dword ptr [esi*4+12A1110h]
    */
    switch (argc)
    {
    case -1:
        printf("case 0\n");
        break;
    case 1:
        printf("case 1\n");
        break;

    case 2:
        printf("case 2\n");
        break;
    case 3:
        printf("case 3\n");
    case 5:
        printf("case 5\n");
        break;
    case 6:
        printf("case 6\n");
        break;
    case 7:
        printf("case 7\n");
        break;
    default:
        printf("default \n");
        break;

    }
    printf("HelloWorld\n");

在这里插入图片描述

3.case情况 > 3种,case值最大- 最小case < 255

	/*
	特征
	编译器会生成两个表
	下标表:下标表里记录了对应case地址表的下标
	case地址表:记录case语句块的地址
	*/
	switch (argc)
    {
    case 22:
        printf("case 0\n");
        break;
    case 20:
        printf("case 1\n");
        break;

    case 23:
        printf("case 2\n");
        break;
    case 24:
        printf("case 3\n");
    case 25:
        printf("case 5\n");
        break;
    case 26:
        printf("case 6\n");
        break;
    case 35:
        printf("case 7\n");
        break;
    default:
        printf("default \n");
        break;

    }
    printf("HelloWorld\n");
    return 0;

在这里插入图片描述
下标表
在这里插入图片描述
地址表
在这里插入图片描述

4.case情况 > 3种,case值最大- 最小case > 255

/*
	特征是二分优化
    注意:
    会进行二分优化和前面三种混合优化
    如二分优化加上建表的优化这几种变化的组合
    */
   
    switch (argc)
    {
    case 10:
        printf("case 0\n");
        break;
    case 200:
        printf("case 1\n");
        break;

    case 400:
        printf("case 2\n");
        break;
    case 800:
        printf("case 3\n");
    case 1000:
        printf("case 5\n");
        break;
    case 2000:
        printf("case 6\n");
        break;
    case 500:
        printf("case 7\n");
        break;
    default:
        printf("default \n");
        break;

    }
    printf("HelloWorld\n");
    return 0;

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值