C语言 switch和if..else的区别 以及枚举的作用_c++ switch和if...else if...else-程序员宅基地

技术标签: iOS开发  

C语言 switch和if..else的区别   以及枚举的作用

1.分支结构的两种形式:if/else 和 switch/case

2.两者简单的区别:前者是两个分支的选择,后者是多分支选择,各有各的使用场景。其实如果switch能实现的,if也能实现,但是要级联很多层,代码的可读性比较差,不易维护,switch本身就是分支选择,而且结构很清晰

3.下面有它们两个详细的区别,大家不用去纠结这点,了解一下即可

switch...case与if...else的根本区别在于,switch...case会生成一个跳转表来指示实际的case分支的地址,而这个跳转表的索引号与switch变量的值是相等的。从而,switch...case不用像if...else那样遍历条件分支直到命中条件,而只需访问对应索引号的表项从而到达定位分支的目的。
具体地说,switch...case会生成一份大小(表项数)为最大case常量+1的跳表,程序首先判断switch变量是否大于最大case 常量,若大于,则跳到default分支处理;否则取得索引号为switch变量大小的跳表项的地址(即跳表的起始地址+表项大小*索引号),程序接着跳到此地址执行,到此完成了分支的跳转。具体代码如下:

用gcc编译器,生成汇编代码
 .file "shiyan.c"
 .text
.globl main
 .type main, @function
main:
 leal 4(%esp), %ecx
 andl $-16, %esp
 pushl -4(%ecx)
 pushl %ebp
 movl %esp, %ebp
 pushl %ecx
 subl $20, %esp
 movl $3, -8(%ebp)
 cmpl $4, -8(%ebp)
 ja .L2
 movl -8(%ebp), %eax
 sall $2, %eax
 movl .L8(%eax), %eax
 jmp *%eax
 .section .rodata
 .align 4
 .align 4
.L8:
 .long .L3
 .long .L4
 .long .L5
 .long .L6
 .long .L7
 .text
.L3:
 movl $0, -12(%ebp)
 jmp .L11
.L4:
 movl $1, -12(%ebp)
 jmp .L11
.L5:
 movl $2, -12(%ebp)
 jmp .L11
.L6:
 movl $3, -12(%ebp)
 jmp .L11
.L7:
 movl $4, -12(%ebp)
 jmp .L11
.L2:
 movl $10, -12(%ebp)
.L11:
 addl $20, %esp
 popl %ecx
 popl %ebp
 leal -4(%ecx), %esp
 ret
 .size main, .-main
 .ident "GCC: (Ubuntu 4.3.3-5ubuntu4) 4.3.3"
 .section .note.GNU-stack,"",@progbits

由以上看来,

switch有点以空间换时间的意思,而事实上也的确如此。
1.当分支较多时,当时用switch的效率是很高的。因为switch是随机访问的,就是确定了选择值之后直接跳转到那个特定的分支,但是if。。else是遍历所以得可能值,知道找到符合条件的分支。如此看来,switch的效率确实比ifelse要高的多。
2.由上面的汇编代码可知道,switch...case占用较多的代码空间,因为它要生成跳表,特别是当case常量分布范围很大但实际有效值又比较少的情况,switch...case的空间利用率将变得很低。
3.switch...case只能处理case为常量的情况,对非常量的情况是无能为力的。例如 if (a > 1 && a < 100),是无法使用switch...case来处理的。所以,switch只能是在常量选择分支时比ifelse效率高,但是ifelse能应用于更多的场合,ifelse比较灵活。

由此看来,上面的中断处理程序中用switch是比较合适的,即节省了时间,而且对于以后程序的扩展也是很方便。因为报文类型这个值基本上都是用整形常量来表示的。


枚举类型:在一定程度上,是对布尔类型的一个扩展,因为BOOL类型只有YES 和 NO两种取值,有时候就不够用了。另一方面:提高代码的可读性,也就是把人类更容易理解的标识符和数字形成简单的对应。。在你们后期做项目和开发过程中switch通常会和枚举值配合使用,表达式是枚举值的变量,case是枚举值,可读性更高。。。


版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u014536527/article/details/48878649

智能推荐

计算机毕业设计Java高校招生管理系统(源码+系统+mysql数据库+Lw文档)_考试招生录取系统伪代码-程序员宅基地

文章浏览阅读533次。计算机毕业设计Java高校招生管理系统(源码+系统+mysql数据库+Lw文档)前端技术:Layui、HTML、CSS、JS、JQuery等技术。JSP健身俱乐部网站设计与实现sqlserver和mysql。ssm基于javaweb开发数码产品推荐平台系统设计与实现。ssm基于HTML的“牧经校园疫情防控网站”的设计与实现。JSP计算机C语言学习网站的设计与实现sqlserver。JSP酒店餐饮管理系统的设计与实现sqlserver。springboot体育馆预定管理平台的设计与实现。_考试招生录取系统伪代码

RecyclerView GridLayoutManager 自适应宽高_gridlayoutmanager 自适应宽度-程序员宅基地

文章浏览阅读8.7k次,点赞2次,收藏2次。import android.content.Context;import android.support.v7.widget.GridLayoutManager;import android.support.v7.widget.RecyclerView;import android.util.TypedValue;/** * Created by Administrator on 2_gridlayoutmanager 自适应宽度

浅谈实时流平台Kafka的消息系统设计_kafka实时方案-程序员宅基地

文章浏览阅读1.2k次。Many users of Kafka process data in processing pipelines consisting of multiple stages, where raw input data is consumed from Kafka topics and then aggregated, enriched, or otherwise transformed into ..._kafka实时方案

计算机控制闪光灯,摄影技巧 闪灯篇 光圈控制主体 快门控制场景 闪光灯又该如何调整输出功率?...-程序员宅基地

文章浏览阅读469次。先设定相机,后设定闪光灯。在离机闪领域,M 模式是应用上的大宗。在拍摄时,我们会面临两个问题,一个是闪光灯的出力(输出功率),另一个则是相机的测光、曝光设定。基本上,我们是先决定相机的设定值,再决定闪光灯的出力问题。先参考环境光,再考虑闪光灯。思考一下:在闪光灯未触发时,相机的设定值本身不能让主体过曝!当主体已过曝,那么闪光灯进来时,结果还是过曝!但如果主体曝光不足,我们就用闪灯将他补足光线。如何..._光圈控制主体的明暗

.Net Core5.0 上传文件报错413 Request Entity Too Large_.net core 413 request entity too large-程序员宅基地

文章浏览阅读612次。开发环境:.Net Core 5.0 + MVC 进行开发.Net Core5.0 上传文件报错413 Request Entity Too Large_.net core 413 request entity too large

pythoninstaller打包 其他电脑无法运行_新手初学 py 后用 pyinstaller 打包程序后运行 exe 出现问题...-程序员宅基地

文章浏览阅读450次。用 python3.6 制作了个爬虫。在 pycham 里能正常运行,用了 requests,beautifulsoup,pandas,json,re,datetime 等第三方库但是 pyinstaller 打包完成没什么问题,运行 exe 程序就出现了错误:源码地址: https://gitee.com/rufengkj/zwu_educational_system/blob/master/s..._pyinstaller打包后别人的电脑不运行

随便推点

蒲公英 · JELLY技术周刊 Vol.06: Deno 1.0 发布前瞻,“真香定律”能否再现_在影片的不同阶段,鼠标交互有不同的效果,非常巧妙地将 web 技术与影片叙事结合到-程序员宅基地

文章浏览阅读849次。登高远眺天高地迥,觉宇宙之无穷基础技术Deno 1.0 即将发布,你需要知道的都在这里了Deno——来自 Node 之父 Ryan Dahl 的最新力作,在开源 2 年之际,终于将迎来 1.0 的正式版本。Deno 并不是 Node 的替代品,根据 Deno GitHub 官网上的介绍,Deno 是一款通用的 JavaScript/TypeScript 编程环境,它汇集了许多最出色的开源技术,并使用一个很小的可执行文件提供了全面的解决方案。如今的 Deno,基于 Rust,内置了 TypeS._在影片的不同阶段,鼠标交互有不同的效果,非常巧妙地将 web 技术与影片叙事结合到

mysql报错1708_mysql的AB及读写和集群-程序员宅基地

文章浏览阅读60次。Mysql的AB及读写第1章 Mysql的AB配置1.1 master配置1.2slave配置1.2.1 192.168.13.1901.2.2 192.168.13.1911.2.3 192.168.13.1921.2.4 192.168.13.1931.2.4 192.168.13.189第2章 读写分离2.1安装mycat2.1.1 server.xml2.1.1 schema.xml2..._hy000 1708

解决树莓派3B+:只有红灯常亮绿灯不亮_树莓派启动不了,绿灯一直不亮-程序员宅基地

文章浏览阅读1w次,点赞2次,收藏10次。一句话总结本文解决方法:可能是烧录软件有问题,使用Etcher烧录后,可正常开机;以下为解决该问题过程:最近重新给树莓派3B+安装系统,按照之前的方法往SD卡烧录系统:烧录方法:1 .SDFormatter格式化SD卡; 2.Win32DiskImager负责写入系统;接通电源后只有红灯亮,绿灯不亮,查询文章和问答,基本没有很好的解决这个问题:文章和问答常见总结:SD卡有问题,或者树莓派坏了;继续查找问题,知知乎上这篇文章如何给树莓派安装操作系统 - 知乎介绍安装SD卡的_树莓派启动不了,绿灯一直不亮

java反序列化耗时_java序列化方式性能比较-程序员宅基地

文章浏览阅读1.1k次。有一个很不错的工具http://github.com/eishay/jvm-serializers/,可以用它来评测各种流行的java序列化反序列化工具,使用上也很简单。想试试该工具的,下载源码后参考起README操作即可。而我更关心的是,是各种工具的性能对比,以作选择的一个衡量标准,也就是http://github.com/eishay/jvm-serializers/wiki的 图示和数据..._序列化反序列化耗时分析

r语言 c 函数返回值,R语言入门 输出函数 cat、print、paste等区别理解-程序员宅基地

文章浏览阅读2.8k次。一、 简介cat、print函数都是输出函数> cat("hello world")hello world>> print("hello world")[1] "hello world"print的输出有点像列表输出的未命名元素> alist=list(c(1,2,3,4,5),c('a','b','c','d','e'))> alist[[1]][1] 1 2 3 ..._r语言print

hadoop启动和运行中的error总结和处理方法-程序员宅基地

文章浏览阅读248次。错误一:2010-11-09 16:59:07,307 INFO org.apache.hadoop.ipc.Server: Error register getProtocolVersionjava.lang.IllegalArgumentException: Duplicate metricsName:getProtocolVersionat org.apa..._启动hadoop报错 got error reading edit log input stream