• 请不要在回答技术问题时复制粘贴 AI 生成的内容
814084764
V2EX  ›  程序员

do{}while(false) 这么使用上瘾了

  •  1
     
  •   814084764 · Jun 6, 2018 · 10038 views
    This topic created in 3076 days ago, the information mentioned may be changed or developed.

    如题。

    特别是在需要 return 的函数里面,真 TM 爽!

    46 replies  •  2018-06-07 19:34:49 +08:00
    Akiyu
    Akiyu
    Jun 6, 2018
    1
    不懂什么意思, 直接在 do while 里面写 false
    不就和没有写循环控制语句一样么
    rootx
    rootx
    Jun 6, 2018 via iPhone
    2
    怎么个爽法
    sun1991
    sun1991
    Jun 6, 2018❤️1
    3
    @Akiyu 循环只执行一次, 但是中间可以跳出该循环
    jjianwen68
    jjianwen68
    Jun 6, 2018
    4
    没明白好处
    opengps
    opengps
    Jun 6, 2018
    5
    我也没看懂,需要跳出时候跟直接 return 有啥区别?
    ysc3839
    ysc3839
    Jun 6, 2018 via Android
    6
    第一次见这种用法好像是在微软的代码里?因为返回之前要释放一些资源,所以不能直接 return。
    也有不用这种写法直接用 goto 的,但是 goto 只有 C/C++ 可以用。
    huoru
    huoru
    Jun 6, 2018❤️1
    7
    一般是 用在宏里面吧?
    remarrexxar
    remarrexxar
    Jun 6, 2018❤️4
    8
    是不是这个意思
    do{

    blockA

    if(...){
    break;
    }

    blockB

    }while(false)

    blockC

    blockA 执行后满足某条件则不执行 blockB,直接执行 blockC,类似于 goto 的作用
    kran
    kran
    Jun 6, 2018 via iPhone
    9
    解决代码嵌套很管用
    c3824363
    c3824363
    Jun 6, 2018
    10
    goto 就挺好
    有些语言自以为去掉 goto 就不会产生非常混乱的代码了
    wplct
    wplct
    Jun 6, 2018
    11
    为啥不再定义个方法?
    grantonzhuang
    grantonzhuang
    Jun 6, 2018 via Android
    12
    @remarrexxar 大 js 的立即执行函数也可以这么搞😂
    ryd994
    ryd994
    Jun 6, 2018 via Android
    13
    所以啊,实际上 goto 该用还是得用
    而且你这样也只能考虑一种 bailout
    实际上还会遇到多层嵌套的情况,比如到一半的时候拿了 xx 锁,过了一会又拿了 yy 内存。如果只有一层 bailout 的话就只能在出口判断自己要不要释放。
    有 goto 的话加一个 cleanup xx 的 label 就好
    zhuangzhuang1988
    zhuangzhuang1988
    Jun 6, 2018
    14
    有好看的异常不用 用这货。
    ryd994
    ryd994
    Jun 6, 2018 via Android
    15
    等等,没有 goto 的语言一般是有 throw catch exception 的。用 exception 来代替的好处是,可以不用一层层检查返回值,直接扔给上层。用 goto 退的话,你还是跑不掉要检查返回
    reself
    reself
    Jun 6, 2018
    16
    看是啥语言。貌似还能对付宏定义的问题
    Mitt
    Mitt
    Jun 6, 2018 via iPhone
    17
    @zhuangzhuang1988 异常代价高啊
    notreami
    notreami
    Jun 6, 2018
    18
    想不明白,什么场景非要这样写,大部分语言都有对应的跳出当前代码块
    cuzfinal
    cuzfinal
    Jun 6, 2018
    19
    菜鸡前端无法理解
    jiang42
    jiang42
    Jun 6, 2018 via iPhone
    20
    C 里头宏的一种惯用法
    xiangyuecn
    xiangyuecn
    Jun 6, 2018
    21
    前端后端习惯性使用 while(true){........; break;}, 你这个少 3 个字符, 算你牛

    套一层之后的最大好处是,不支持 goto、break 的代码段,可以随意 break 跳出去(滑稽
    Enivel
    Enivel
    PRO
    Jun 6, 2018
    22
    return early 的一种写法, 多个 return 会使代码变得混乱, 通过 do while 进行流程控制可以 做到一个入口 一个出口. 而且可以避免 if else 嵌套 阻止箭头形代码的形成. 好处多的数不过来 大家了解一下吧
    Loren
    Loren
    Jun 6, 2018 via Android
    23
    C 语言的宏里也常用
    bumz
    bumz
    Jun 6, 2018
    24
    ```
    a();

    do {
    b();
    if (c()) break;
    d();
    } while (false);

    e();
    ```

    等价于

    ```
    a();
    b();
    if (!c()) {
    d();
    }
    e();
    ```

    但前者更令人费解
    hsuan
    hsuan
    Jun 6, 2018 via Android
    25
    C 里非常常见的写法,居然这么多人不知道?看来 C 真是没落了。
    VDimos
    VDimos
    Jun 6, 2018 via Android
    26
    让我想起了 react 里面的用抛出错误的方式中断,有种异曲同工之妙
    thedrwu
    thedrwu
    Jun 6, 2018 via Android❤️2
    27
    在古老的 C 技巧中常常用来写在宏里当作简单而正确的的 inline (比如 linux 内核中)

    若是如楼上所说用作 break,那一般是编码有问题,应该试着把其中内容封装成一个函数。装成函数还能有利于单元测试。
    iceheart
    iceheart
    Jun 6, 2018 via Android
    28
    直接用 lambda 会更爽
    fuxiuyin
    fuxiuyin
    Jun 7, 2018 via iPhone
    29
    这算是 goto 吧
    takeoffyoung
    takeoffyoung
    Jun 7, 2018
    30
    @ysc3839 golang 的 defer 就是为这个需求量身定做
    mon6912640
    mon6912640
    Jun 7, 2018 via Android
    31
    感谢,学到了一个实用技巧,真是巧妙
    redsonic
    redsonic
    Jun 7, 2018
    32
    竟然这么多人不知道,记得是内核开发面试必问的一道题。。
    FrankFang128
    FrankFang128
    Jun 7, 2018
    33
    还不如 goto 好读……
    guanhui07
    guanhui07
    Jun 7, 2018
    34
    虽然我也喜欢用 goto ,很多企业 不会让用 goto 吧 -
    wanderpoet
    wanderpoet
    Jun 7, 2018 via iPhone
    35
    对于 goto 的因噎废食真是够了 滥用当然不行 但也没必要一刀切的禁用 goto
    AV1
    AV1
    Jun 7, 2018❤️1
    36
    @xiangyuecn JS 有可读性更好的方法……

    // Using a labeled block with break
    foo: {
    console.log('face');
    break foo;
    console.log('this will not be executed');
    }
    console.log('swap');

    // this will log:

    // "face"
    // "swap
    ytlm
    ytlm
    Jun 7, 2018
    37
    在某些情况下这种写法还是比较有用处的
    grewer
    grewer
    Jun 7, 2018
    38
    在 do 里面的 break 相当于一个匿名函数的 return
    dychenyi
    dychenyi
    Jun 7, 2018
    39
    @LevineChen 对的, 这种函数开始是初始化,最后是析构,释放内存的代码,如果写 return,相当于每一个 return 前都要释放
    des
    des
    Jun 7, 2018 via Android
    40
    @DOLLOR lint 默认禁止这么用
    xiangyuecn
    xiangyuecn
    Jun 7, 2018
    41
    @DOLLOR #36 第一次见到这个语法 只知道 for while 可以用标签 js 果然厉害 学习了
    twotiger
    twotiger
    Jun 7, 2018
    42
    class MyException(Exception):
    pass

    try:
    print('a1')
    raise MyException()
    print('a2')
    except MyException:
    pass

    print('a3')

    那么在 python 里面是这种写法么?
    还是经验太少了,没发现有什么亮点
    stackexplode
    stackexplode
    Jun 7, 2018
    43
    这么经典的安全资源释放方法居然那么多人不知道,还批判了起来
    dbpe
    dbpe
    Jun 7, 2018
    44
    不是很理解...中午去跟一下...
    814084764
    814084764
    OP
    Jun 7, 2018
    45
    @twotiger 这个本来就不是一个 exception。。还有 exception 有性能问题吧? java 中有。不知道 python 中有没有。
    Menci
    Menci
    Jun 7, 2018 via Android
    46
    @twotiger 异常得多写不少代码吧
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   688 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 119ms · UTC 20:03 · PVG 04:03 · LAX 12:03 · JFK 15:03
    ♥ Do have faith in what you're doing.