switch 需要手动 break,这算不算设计上的一个缺陷? - V2EX
请不要在回答技术问题时复制粘贴 AI 生成的内容
hspeed18

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

  •  
  •   hspeed18 Apr 12, 2020 4910 views
    This topic created in 2236 days ago, the information mentioned may be changed or developed.

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

    21 replies    2020-04-12 23:20:19 +08:00
    wangbenjun5
        1
    wangbenjun5  
       Apr 12, 2020
    所以 Go 的 switch 就自带 break 了。。。
    toboro
        2
    toboro  
       Apr 12, 2020   1
    这样可以把一堆做相同事情的 case 组合到一起嘛,比如要求用户输入 y/N 决定是否继续:

    switch (c) {
    case 'y':
    case 'Y':
    // yes
    break;
    default:
    // no
    break;
    }
    lneoi
        3
    lneoi  
       Apr 12, 2020
    开始学的时候感觉这是个缺陷,但在用的时候常常会用到二楼的情况,所以感觉还不错
    Mithril
        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 避免意外。
    xiri
        5
    xiri  
       Apr 12, 2020
    确实,二楼那种场景很有用,y/Y/yes/YES 写在一起就行了
    mxalbert1996
        6
    mxalbert1996  
       Apr 12, 2020 via Android
    这个功能有时候确实是有用的,所以我觉得像 Swift 那样默认 break 并且支持显式 fallthrough 就挺好的。
    RicardoY
        7
    RicardoY  
       Apr 12, 2020 via iPhone
    自动 break 就没有达夫设备这种东西了
    iasuna
        8
    iasuna  
       Apr 12, 2020 via iPhone
    请定义“正常人的逻辑思维”
    tanghongkai
        9
    tanghongkai  
       Apr 12, 2020
    switch 更像代码块标签而不是分支执行的感觉
    lidjxy
        10
    lidjxy  
       Apr 12, 2020 via iPhone
    swift 也支持多个 case 合并
    case y,Y,yes,YES:
    case no:
    nannanziyu
        11
    nannanziyu  
       Apr 12, 2020
    @lidjxy
    golang 出来的比 swift 早大概两年

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

    我发现 V2EX 上的人真的很少看楼里其他的回帖……
    pikaconan
        16
    pikaconan  
       Apr 12, 2020
    点进来之前我以为是任天堂那个 switch...心想 break 是跟联机有关吗

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

    switch{
    case "a":"b":"c":
    ......
    case "d":
    ......
    case "e":
    ......goto "d";
    default:
    ......goto "a";
    }
    chenluo0429
        18
    chenluo0429  
       Apr 12, 2020
    @xuanbg
    ```kotlin
    when(str) {
    "a", "b", "c" -> {
    print("abc")
    }
    "d", "e" -> {
    print("de")
    }
    }
    ```
    cyspy
        19
    cyspy  
       Apr 12, 2020
    C 和编译的对应关系很强,不带 break 编译后基本等于一个简单 jmp,然后继续执行
    laike9m
        20
    laike9m  
       Apr 12, 2020 via Android
    saber000
        21
    saber000  
       Apr 12, 2020
    @RicardoY 不太严谨,达夫设备有不依赖 switch 的实现,而且性能可以更好
    About     Help     Advertise     Blog     API     FAQ     Solana     3187 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 71ms UTC 13:38 PVG 21:38 LAX 06:38 JFK 09:38
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86