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

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