在我看来,这个特性有悖于正常人的逻辑思维。
1
wangbenjun5 2020-04-12 18:56:07 +08:00
所以 Go 的 switch 就自带 break 了。。。
|
2
toboro 2020-04-12 19:09:23 +08:00 1
这样可以把一堆做相同事情的 case 组合到一起嘛,比如要求用户输入 y/N 决定是否继续:
switch (c) { case 'y': case 'Y': // yes break; default: // no break; } |
3
lneoi 2020-04-12 19:25:43 +08:00
开始学的时候感觉这是个缺陷,但在用的时候常常会用到二楼的情况,所以感觉还不错
|
4
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 避免意外。 |
5
xiri 2020-04-12 19:33:57 +08:00
确实,二楼那种场景很有用,y/Y/yes/YES 写在一起就行了
|
6
mxalbert1996 2020-04-12 19:42:28 +08:00 via Android
这个功能有时候确实是有用的,所以我觉得像 Swift 那样默认 break 并且支持显式 fallthrough 就挺好的。
|
7
RicardoY 2020-04-12 19:45:57 +08:00 via iPhone
自动 break 就没有达夫设备这种东西了
|
8
iasuna 2020-04-12 19:46:35 +08:00 via iPhone
请定义“正常人的逻辑思维”
|
9
tanghongkai 2020-04-12 19:46:56 +08:00
switch 更像代码块标签而不是分支执行的感觉
|
10
lidjxy 2020-04-12 20:03:13 +08:00 via iPhone
swift 也支持多个 case 合并
case y,Y,yes,YES: case no: |
11
nannanziyu 2020-04-12 20:16:26 +08:00
@lidjxy
golang 出来的比 swift 早大概两年 这就是两种不同的设计思路: 默认 break+显式 fallthrough vs 默认 fallthrough+显式 break 感觉前一种更好一些,因为漏 break 以前也算比较常见的 bug 之一了。不过现在编译器基本都会给 warning,也没啥大的区别 |
12
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; } ``` |
13
chenliangngng 2020-04-12 20:41:19 +08:00 via Android
duff 算法,就是利用 switch 默认不 break 的特点,实现大数据循环的,比正常的 for 循环快得多,可以了解下
|
15
nannanziyu 2020-04-12 20:49:42 +08:00
@RicardoY
@chenliangngng 默认不 break,但是可以显式 fallthrough,一样可以实现 Duff's Device 我发现 V2EX 上的人真的很少看楼里其他的回帖…… |
16
luhe 2020-04-12 20:56:13 +08:00
点进来之前我以为是任天堂那个 switch...心想 break 是跟联机有关吗
我没有 switch |
17
xiangyuecn 2020-04-12 21:00:44 +08:00
语法而已,如果是我定义的语法我就定成这样,不是我定义的语法我也要这样写(写套编译前的预处理工具)任性😂
switch{ case "a":"b":"c": ...... case "d": ...... case "e": ......goto "d"; default: ......goto "a"; } |
18
chenluo0429 2020-04-12 21:37:11 +08:00
|
19
cyspy 2020-04-12 23:11:53 +08:00
C 和编译的对应关系很强,不带 break 编译后基本等于一个简单 jmp,然后继续执行
|
20
laike9m 2020-04-12 23:19:59 +08:00 via Android
是
|