switch 需要手动 break,这算不算设计上的一个缺陷?

2020-04-12 18:40:30 +08:00
 hspeed18

在我看来,这个特性有悖于正常人的逻辑思维。

3805 次点击
所在节点    程序员
21 条回复
wangbenjun5
2020-04-12 18:56:07 +08:00
所以 Go 的 switch 就自带 break 了。。。
toboro
2020-04-12 19:09:23 +08:00
这样可以把一堆做相同事情的 case 组合到一起嘛,比如要求用户输入 y/N 决定是否继续:

switch (c) {
case 'y':
case 'Y':
// yes
break;
default:
// no
break;
}
lneoi
2020-04-12 19:25:43 +08:00
开始学的时候感觉这是个缺陷,但在用的时候常常会用到二楼的情况,所以感觉还不错
Mithril
2020-04-12 19:27:45 +08:00
算不上是缺陷吧,只是不同的实现方法而已。最早期的那些语言也有两种不同实现方式的。Pascal 系列的基本都自带 break,相当于连着好几个 if,但是你可以在 case 里面写好几个值。然后 C 系列的语言都支持这种 case 语句的 fall through,实际上就是一堆的 goto 。
但就算是 C 语言,这个 fall through 也不是很常用。哪怕是最老的那些 C 语言编译器的代码,也只有很少的 switch 语句用到了 fall through 。而继承自 C 语言的一系列现代编程语言基本都保留了这个功能,或者像 C#一样优化了一下,只允许空的 case 语句进行 fall through 避免意外。
xiri
2020-04-12 19:33:57 +08:00
确实,二楼那种场景很有用,y/Y/yes/YES 写在一起就行了
mxalbert1996
2020-04-12 19:42:28 +08:00
这个功能有时候确实是有用的,所以我觉得像 Swift 那样默认 break 并且支持显式 fallthrough 就挺好的。
RicardoY
2020-04-12 19:45:57 +08:00
自动 break 就没有达夫设备这种东西了
iasuna
2020-04-12 19:46:35 +08:00
请定义“正常人的逻辑思维”
tanghongkai
2020-04-12 19:46:56 +08:00
switch 更像代码块标签而不是分支执行的感觉
lidjxy
2020-04-12 20:03:13 +08:00
swift 也支持多个 case 合并
case y,Y,yes,YES:
case no:
nannanziyu
2020-04-12 20:16:26 +08:00
@lidjxy
golang 出来的比 swift 早大概两年

这就是两种不同的设计思路:
默认 break+显式 fallthrough vs 默认 fallthrough+显式 break
感觉前一种更好一些,因为漏 break 以前也算比较常见的 bug 之一了。不过现在编译器基本都会给 warning,也没啥大的区别
xuanbg
2020-04-12 20:25:13 +08:00
自动 break 的话下面这样的代码就不能实现了
```java
switch (str){
case "a":
case "b":
case "c":
doA();
break;
case "d":
doD();
break;
}
```
要写成:
```java
switch (str){
case "a":
doA();
case "b":
doA();
case "c":
doA();
case "d":
doD();
break;
}
```
chenliangngng
2020-04-12 20:41:19 +08:00
duff 算法,就是利用 switch 默认不 break 的特点,实现大数据循环的,比正常的 for 循环快得多,可以了解下
reus
2020-04-12 20:44:00 +08:00
@xuanbg case 'a', 'b', 'c': doA(); case 'd': doB().
nannanziyu
2020-04-12 20:49:42 +08:00
@RicardoY
@chenliangngng
默认不 break,但是可以显式 fallthrough,一样可以实现 Duff's Device

我发现 V2EX 上的人真的很少看楼里其他的回帖……
luhe
2020-04-12 20:56:13 +08:00
点进来之前我以为是任天堂那个 switch...心想 break 是跟联机有关吗

我没有 switch
xiangyuecn
2020-04-12 21:00:44 +08:00
语法而已,如果是我定义的语法我就定成这样,不是我定义的语法我也要这样写(写套编译前的预处理工具)任性😂

switch{
case "a":"b":"c":
......
case "d":
......
case "e":
......goto "d";
default:
......goto "a";
}
chenluo0429
2020-04-12 21:37:11 +08:00
@xuanbg
```kotlin
when(str) {
"a", "b", "c" -> {
print("abc")
}
"d", "e" -> {
print("de")
}
}
```
cyspy
2020-04-12 23:11:53 +08:00
C 和编译的对应关系很强,不带 break 编译后基本等于一个简单 jmp,然后继续执行
laike9m
2020-04-12 23:19:59 +08:00

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

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

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

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

© 2021 V2EX