引出

你有没有想过既然有了if elseif, 为什么还要设计一个switch case的语法出来呢? 按理说, 一个语言的设计角度来说, 关键词越少越好吧, 而且多出来一种选择分支也没有看出太大用处. 以下几种switch case均可以写成if else的形式(java 代码):

// 形式一
switch(a){case 1:break;case 2:break;default:break;
}
if(a == 1){
}else if(a == 2){
}else{}// 形式二
switch(a){case 1:case 2://do somethingbreak;default:break;
}
if(a == 1 || a == 2){
}else{}

经过多次尝试, 所有的 switch case都可以转换成if else. 那当初涉及语言的大佬为什么要多此一举搞了这么一个switch case出来呢? 是何用意? 甚至还要加一个时不时就忘记的break.

分析

虽然我们已然回不到当初设计高级语言的哪个年代, 但是要继承胡先生的思想: "大胆假设, 小心求证".

为了了解为什么要设计出switch case, 就要先了解到它的特性, 借此来进一步推断设计的初衷, 亦或是弥补了if else的某些不足?

  1. switch case仅支持数字和字符串相等的判断, 甚至在 C 语言中只支持数字相等(其实其他语言也只支持数字, 随便写个 java 反编译一下就会发现, 它将一个switch case转成了两个, 一次字符串 hash 判断, 一次结果判断).
  2. switch case会跳转到符合条件的地方一直执行, 直到遇到break.

没了, switch case就这么点东西. 相比之下, 它只能做数字的相等校验, 比if else要笨的多, if else可以做所有的逻辑判断.

如果只能做数字的相等判断, 那么是不是可以将其想象成一个类似数组的结构, 可以直接以下标的形式进行索引, 而不是像if else要一个一个的进行判断呢? 没错, 事实上还真的是这样.

一个 switch case编译后的执行流程大致如下:

  • 将每一个 case编译后代码的首地址保存到一个数组中.
  • 根据传入的值进行判断, 若数据元素不存在, 直接跳到 default.
  • 若元素存在, 直接跳到索引处的地址继续执行.
  • 其中的break标志直接跳到结尾处.

画个简陋的图来对执行过程进行说明, 生成的索引数组中保存着对应跳转的具体地址, 然后直接进行数据的随机访问就可以完成比较了.

看到这里, switch caseif else的区别呼之欲出了. switch case利用了数组的随机访问, 大幅度提升了判断的效率. 但是为了随机访问, 这里生成了一个中间数组来保存地址, 空间换时间.

总结

那么, 设想一下, 在最开始的语言设计时, 为什么要有switch case这种空间换时间的做法呢? 我猜, 可能是因为当时的 CPU 处理速度比较慢, 所以考虑到如此处理来令程序的运行速度加快. 亦或是最初的语言设计者为了追求完美, 将这种可加快条件判断的的语法也加进去了.

不过个人觉得, 如今的 CPU 运行速度已经如此速度了, 对于我们工作在应用层的人, 这点速度的影响应该是可以忽略不记的吧. 别说, 我试了几种比较流行的语言, 发现Python就不支持, 哈哈, 用了这么久Python还是突然发现它不支持switch case, 由此可见, switch case我用的比较少.

最后, 其实我就是好奇有了if else为什么还要设计个switch出来, 结果找着找着还真挺有意思的, switch的底层实现居然是数组的随机访问, 果然, 就不能想, 全是学问.

有了 elseif 为什么还要 switch case相关推荐

  1. php switch 函数,php switch case用法与实例教程

    switch 语句和 elseif 语句的比较 在 switch 语句中,条件只求一次,然后和每个 case 比较,而在 elseif 语句中,条件会再次求值.如果你的条件比较复杂,或者是多次循环,用 ...

  2. MATLAB Simulink中自定义函数和switch case的用法

    文章目录 1 Simulink自定义函数MATLAB Function 2 Simulink中Switch Case模块的用法 1 Simulink自定义函数MATLAB Function 首先写一个 ...

  3. 消除switch/case语句,不破坏代码的封闭性,使程序结构更符合面向对象思想(二)

    在 "消除switch/case语句,不破坏代码的封闭性,使程序结构更符合面向对象思想(一)"中,我们曾讨论过维护一个消息管理器来记录不同消息和它对应的消息处理类. 但是,这种实现 ...

  4. java case 的错误_关于java:switch case语句错误:case表达式必须是常量表达式

    我的switch-case语句昨天运行得很好. 但是当我今天早些时候运行代码时,eclipse给了我一个错误,用红色突出显示case语句并说:case表达式必须是常量表达式,它是常量我不知道发生了什么 ...

  5. Matlab中switch, case, otherwise语句

    目录 语法 说明 示例 比较单个值 与多个值进行比较 switch, case, otherwise语句是执行多组语句中的一组. 语法 switch switch_expressioncase cas ...

  6. switch case的用法

    switch case的用法如下: 1.Switch用在编程中,如C语言中它经常跟Case一起使用,是一个判断选择代码.其功能就是控制流程流转的.直线翻译:switch语句,即"切换&quo ...

  7. switch case语法

    文章目录 switch case组合 不要拿青龙偃月刀去削苹果 case的作用是什么? break的作用是什么? case后面的值有什么要求吗? case语句的排列顺序问题 default语句相关问题 ...

  8. C语言case次数有限制吗,用switch...case语句统计数字、空格和其他字符出现的次数...

    //用switch...case语句统计数字.空格和其他字符出现的次数 //转自K&R #include int main(void) { int c, i, nwhite, nother, ...

  9. 在C++中对字符串std::string使用switch/case语句

    如果你使用C语音的string,也就是char *,是可以放在switch/case语句中的. 在C++中是不能对字符串string使用switch/case语句的,这里的string指的是std:: ...

最新文章

  1. 就是这么简单(续)!使用 RestAssuredMockMvc 测试 Spring MVC Controllers(转)
  2. svn服务器如何导入导出文件,如何导入svn dump备份文件或源代码文件?
  3. Codeforces 235B Let's Play Osu!
  4. 15.4. syslog, klogctl - read and/or clear kernel message ring buffer; set console_loglevel
  5. How to make a difference
  6. lambda 表达式定制操作
  7. java jobdetail_spring+quartz定时任务配置---JobDetailBean
  8. python入门——P48魔法方法:迭代器
  9. 关于直播,所有的技术细节都在这里了(3)《转载》
  10. linux系统 安卓系统安装教程,在Linux系统上安装Android 4.4图文教程
  11. JAVA多线程基础篇-关键字synchronized
  12. java毕业生设计选课系统计算机源码+系统+mysql+调试部署+lw
  13. css文字超出宽度自动换行
  14. linux7.4 yum配置,redhat7.4配置yum
  15. 高德地图添加瓦片图层
  16. PBA认证有可能像PMP一样流行吗?
  17. 如何离线安装python包
  18. 一看就懂的Docker Consul工具
  19. 为什么我不看好AR眼镜?(转载)
  20. BUAA(2021春)机试检测异常(简)(期末考试题)——简单排序

热门文章

  1. URLDecoder: Illegal hex characters in escape (%) pattern ...
  2. Objective-C文件流操作
  3. html设置了标签但是定义不了,在HTML标签管理器中设置不带元素ID的HTML中的事件...
  4. php里isset的属性,测试PHP中变量是否存在的最佳方法;isset()显然已损坏
  5. mysql执行计划查看_查看Mysql执行计划
  6. codeblocks如何让输出结果 空格_简单讲讲如何实现两个正整数相加,然后输出这个结果...
  7. 【LeetCode笔记】226. 翻转二叉树(Java、递归)
  8. 【LeetCode笔记】42. 接雨水(Java、动态规划)
  9. post大小限制_作为一个程序员,面试中常问的get和post的区别,你真的知道吗
  10. 计算机网络数据链路层 --- 选择重传协议(SR)