提问: ifelse 语句和 switch 语句,除了 if 可以更加具体的判断外,两者还有什么区别呢,各自在什么情况下使用更好

2019-06-25 10:22:26 +08:00
 hyd8323268

提问: ifelse 语句和 switch 语句,除了 if 可以更加具体的判断外,两者还有什么区别呢,各自在什么情况下使用更好

5103 次点击
所在节点    程序员
42 条回复
hyd8323268
2019-06-25 10:25:12 +08:00
刚刚看了看博客说 switch 会比 if 效率更好点,但是具体为什么好呢,好多少
kzfile
2019-06-25 10:26:52 +08:00
我好像在一些地方看到推荐用 if/else 替换 switch
chendy
2019-06-25 10:33:52 +08:00
有的语言(我只知道 kotlin ),case 里可以放条件判断,效果相当于一串 if-else-if
不考虑这个,switch 在一些情况下性能比一串判断好,毕竟只有一次判断,ifelse 可能要判断很多次才能走到复合条件的分支
最后其实还是“具体情况具体分析”,用哪种写起来清晰已读就用哪种
hyd8323268
2019-06-25 10:35:18 +08:00
if 语句会从第一个判断开始,挨个过,直到满足条件。而 switch 会创建一个类似数组的东西,然后把每个 case 内的条件放入,如果需要判断的值是数字,则去判断数组中最大值是否大于变量,小于则直接走 default,如果大于则再走指定 case。

大概是这样吗
misaka19000
2019-06-25 10:35:57 +08:00
这个问题,要具体语言具体分析
annielong
2019-06-25 10:53:13 +08:00
反正个人用的时候判断条件超过 3 个就使用 switch,不超过就用 if
glishijie
2019-06-25 11:10:41 +08:00
不同语言语义是不同的,c 语言 case 只能是常数值,不能是表达式,switch 实现的时候通常会有 switch table,可以减小 cache Miss,性能会好一点
cnzjl
2019-06-25 11:14:59 +08:00
使用 switch..case 应该是更好维护点,你想想 10 个条件在那使用 if...else,然后 switch 的匹配好像是随机的吧,确定了选择值就直接跳过去了,如果是 if 的话就要一步一步走下去,条件多的时候还是推荐 switch
shendaowu
2019-06-25 11:29:04 +08:00
switch 在一定条件下时间复杂度好像可以达到 O(1)。有兴趣可以搜搜“查表法”。这篇好像不错: https://www.jianshu.com/p/3efd6ca8011f。switch 在某些条件下应该是可以优化成类似查表法的东西,我不太确定。楼主如果懂汇编语言的话写一些不同的 switch 语句然后看汇编代码会很好玩的。我之前好像就是在看汇编代码的时候发现 switch 和 if 的区别的。
shendaowu
2019-06-25 11:29:34 +08:00
pkookp8
2019-06-25 11:30:12 +08:00
什么语言
试了下 c 语言,x86 的 gcc,差了一条指令
对 x86 汇编不太熟还没仔细看
shawndev
2019-06-25 11:30:18 +08:00
有模式匹配的语言,switch case 表达力更强。没有模式匹配的语言,多数情况下 switch case 可以使用表驱动法开发。
xuanbg
2019-06-25 11:31:03 +08:00
if()需要按顺序一个个 else if()进行判断执行代码块还是跳出,switch 直达条件所在代码块执行。所以只有一个 if/else 两者没区别,else if 越多区别越大。当然,switch 虽好,不符合条件也是用不了的。
xuanbg
2019-06-25 11:36:01 +08:00
@chendy case 里可以放条件判断,效果并不是相当于一串 if-else-if。case 里的条件只是第二次 match 罢了,不成功就结束了,不会再去 match 下一个 case
dangyuluo
2019-06-25 11:37:36 +08:00
现代编译器足够聪明,在条件不造成其他影响的情况下,能够自动将二者转换,挑选效率最高的那个,放心交给编译器去做就可以了,实在害怕可以看一下出来的汇编代码。

当然你也可以添加分支预测语句`likely(xxx)`,不过一般这时候你也成大牛了。
wysnylc
2019-06-25 12:27:12 +08:00
在 java 中 if else if else 是从上往下逐个匹配,在上百个判断时效率极低,此时 switch 可以站出来了因为时间复杂度是 O(1)
然后还有一种是使用 treeMap 可以做范围条件匹配,简单讲是能用 switch 和 treeMap 就用不行再考虑 if else
maokabc
2019-06-25 12:42:00 +08:00
其他不清楚,java 整数 switch 的话会被编译为 table-switch 或者 lookup-switch,对应查表法和二分法
Shy07
2019-06-25 12:54:59 +08:00
弱类型的建议用 if else 严格判断
switch 建议用 hash/array/map/object + closure 的方式更 FP
ragnaroks
2019-06-25 13:45:17 +08:00
if 可以对应多个判断项,比如`object1!=null && object1.value1 is Int32`,不过如果是 C#的话,7+以上区别不大了,switch 也可以匹配多个表达式
springmarker
2019-06-25 14:06:36 +08:00
一个是静态的,一个是动态的

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/577160

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX