switch 中case的注意

本文通过一个具体的C语言示例程序介绍了switch语句的使用注意事项,包括switch中case标签的数据类型选择及其应用,并展示了递增运算符的结合方向对表达式求值的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.环境:

[root@localhost Desktop]# cat /proc/version 
Linux version 2.6.32-220.el6.i686 (mockbuild@x86-003.build.bos.redhat.com) (gcc version 4.4.5 20110214 (Red Hat 4.4.5-6) (GCC) ) #1 SMP Wed Nov 9 08:02:18 EST 2011

2.代码:

/*

 *wuxiuwen
 *switch 中的注意点  
 */
#include<stdio.h>

int fun1(int a,int b){
    printf("%d,%d\n",a,b);
    return 0;
}
#define N 3
int fun2(){
//      float f;   //此处用于switch中的case,不能用float,float的保存方式不一样;
        int f =3;

        switch(f)
        {
                case N:printf("OK\n");
        }
        return 0;
}
int main()
{
        int i=3;
        printf("j=%d\n",++i+(++i)+(++i));
        fun1(i=4,i);
        fun2();
        return 0;

}

3.说明:

1)switch中的case不能用float,一般用char或者int 、enum等;

2)++等的方式是右结合,所以以后写程序的时候直接加上小括号,这样子一般不会出错; 

3)执行结果:

[root@localhost 20120721_1]# gcc test1.c 
[root@localhost 20120721_1]# ./a.out 
j=16
4,4
OK
[root@localhost 20120721_1]# 

//************************************end*******************************************//

<think>嗯,用户想了解C51中的switch case语句。首先,我需要确认C51是什么。C51通常指的是针对Intel 8051系列单片机的C语言编译器,比如Keil C51。所以用户的问题应该是在8051单片机编程中使用switch case注意事项或特性。 接下来,用户可能已经了解基本的switch case用法,但作为嵌入式系统,特别是8位单片机,资源有限,可能存在一些特殊的地方需要考虑。比如代码优化、内存占用、执行效率等。 首先,我应该回顾标准C语言中的switch case结构,然后指出C51环境下的差异。可能需要提到case的常量表达式限制,比如是否支持范围或复杂表达式。此外,8051的架构特点,比如存储类型(data, idata, xdata)是否影响switch的实现。 然后,考虑跳转表的应用。编译器在处理switch时可能会生成跳转表,这在资源受限的环境中可能占用较多内存,尤其是当case数量多且分布稀疏时。需要建议用户如何优化,比如将case值排列紧凑,或使用if-else替代。 另外,中断服务程序中使用switch case是否有特别注意事项?比如是否影响实时性,是否需要更简洁的结构。 可能还需要提到一些常见错误,比如忘记break导致的意外fall-through,虽然在标准C中也是问题,但在嵌入式系统中可能导致更严重的后果。 最后,提供示例代码,展示正确的用法,并指出关键点。同时,强调调试和优化方法,比如查看编译器生成的汇编代码,了解内存使用情况。 需要确保回答结构清晰,分点说明,涵盖语法、优化、常见问题及示例,帮助用户全面理解在C51中使用switch case注意事项和最佳实践。</think>在C51单片机开发中,`switch-case`语句的底层实现和优化需要特别注意硬件资源限制。以下是分步骤详解: 一、基础语法规范 1. 标准结构: ```c switch(整型变量){ case 常量1: // 操作1 break; case 常量2: // 操作2 break; default: // 默认操作 } ``` 要求: - 判断变量必须是整型(char/short/int) - case值必须是编译时常量 二、C51特殊优化策略 1. 跳转表优化 当case值连续且密集时(例如0-7),编译器会生成跳转表: $$地址 = 基地址 + 偏移量 \times 指令长度$$ 此时执行时间为常数级$$O(1)$$ 2. 二分查找优化 当case值分散但有序时,编译器生成二分判断结构: $$比较次数 = \log_2 N$$ 时间效率为对数级$$O(\log n)$$ 三、内存占用注意点 1. 代码空间消耗对比: - 跳转表方式:每个case占用2字节代码空间 - 分支判断方式:每个case需要3-5条指令(约6-10字节) 2. 优化建议: ```c // 推荐写法(紧凑值域) switch(input){ case 0: ... break; case 1: ... break; // 连续值 case 2: ... break; } // 不推荐写法 switch(input){ case 100: ... break; case 200: ... break; // 值域跨度大 case 300: ... break; } ``` 四、中断服务中的特殊要求 在中断函数中使用时需注意: 1. 避免多层嵌套(建议不超过2层) 2. 单个case处理时间应满足: $$t_{process} < \frac{1}{f_{中断}} - t_{上下文保存}$$ 例如:当使用12MHz晶振时,典型指令周期为1μs 五、调试技巧 1. 查看汇编代码(在Keil中): - 编译后按F5进入调试 - 在Disassembly窗口观察生成的指令 2. 典型模式识别: - `CJNE`指令对应值比较 - `SJMP`实现跳转表 六、与if-else的对比选择 | 条件数量 | 推荐结构 | 执行时间 | 代码量 | |---------|----------|---------|--------| | ≤3 | if-else | O(1) | 较小 | | 4-7 | switch | O(1) | 中等 | | ≥8 | switch | O(1)/O(log n) | 较大 | 七、典型应用示例 ```c // 按键扫描处理 void Key_Handler(uint8_t keycode){ switch(keycode){ case 0x01: LED_Toggle(); // 单字节操作 break; case 0x02: Beep(100); // 短时间操作 break; default: return; // 减少default处理 } } ``` 实践建议: 1. 优先处理高频case 2. 对超过10个分支的情况进行模块化拆分 3. 使用`/* fall through */`注释明确跨case执行意图 通过合理使用`switch-case`结构,可在保持代码可读性的同时,有效利用C51有限的硬件资源(通常仅有128/256字节RAM和4-64KB Flash)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值