V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
hspeed18
V2EX  ›  程序员

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

  •  
  •   hspeed18 · 2020-04-12 18:40:30 +08:00 · 4009 次点击
    这是一个创建于 1689 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    21 条回复    2020-04-12 23:20:19 +08:00
    wangbenjun5
        1
    wangbenjun5  
       2020-04-12 18:56:07 +08:00
    所以 Go 的 switch 就自带 break 了。。。
    toboro
        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;
    }
    lneoi
        3
    lneoi  
       2020-04-12 19:25:43 +08:00
    开始学的时候感觉这是个缺陷,但在用的时候常常会用到二楼的情况,所以感觉还不错
    Mithril
        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 避免意外。
    xiri
        5
    xiri  
       2020-04-12 19:33:57 +08:00
    确实,二楼那种场景很有用,y/Y/yes/YES 写在一起就行了
    mxalbert1996
        6
    mxalbert1996  
       2020-04-12 19:42:28 +08:00 via Android
    这个功能有时候确实是有用的,所以我觉得像 Swift 那样默认 break 并且支持显式 fallthrough 就挺好的。
    RicardoY
        7
    RicardoY  
       2020-04-12 19:45:57 +08:00 via iPhone
    自动 break 就没有达夫设备这种东西了
    iasuna
        8
    iasuna  
       2020-04-12 19:46:35 +08:00 via iPhone
    请定义“正常人的逻辑思维”
    tanghongkai
        9
    tanghongkai  
       2020-04-12 19:46:56 +08:00
    switch 更像代码块标签而不是分支执行的感觉
    lidjxy
        10
    lidjxy  
       2020-04-12 20:03:13 +08:00 via iPhone
    swift 也支持多个 case 合并
    case y,Y,yes,YES:
    case no:
    nannanziyu
        11
    nannanziyu  
       2020-04-12 20:16:26 +08:00
    @lidjxy
    golang 出来的比 swift 早大概两年

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

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

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

    switch{
    case "a":"b":"c":
    ......
    case "d":
    ......
    case "e":
    ......goto "d";
    default:
    ......goto "a";
    }
    chenluo0429
        18
    chenluo0429  
       2020-04-12 21:37:11 +08:00
    @xuanbg
    ```kotlin
    when(str) {
    "a", "b", "c" -> {
    print("abc")
    }
    "d", "e" -> {
    print("de")
    }
    }
    ```
    cyspy
        19
    cyspy  
       2020-04-12 23:11:53 +08:00
    C 和编译的对应关系很强,不带 break 编译后基本等于一个简单 jmp,然后继续执行
    laike9m
        20
    laike9m  
       2020-04-12 23:19:59 +08:00 via Android
    saber000
        21
    saber000  
       2020-04-12 23:20:19 +08:00
    @RicardoY 不太严谨,达夫设备有不依赖 switch 的实现,而且性能可以更好
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3403 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 12:00 · PVG 20:00 · LAX 04:00 · JFK 07:00
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.