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

do...while 语句 ,做了一年开发,从来没用到过,是不是我太菜了。

  •  
  •   k8ser · 2019-03-27 13:19:33 +08:00 · 8699 次点击
    这是一个创建于 2071 天前的主题,其中的信息可能已经有所发展或是发生改变。
    68 条回复    2019-03-28 17:47:56 +08:00
    Kaiv2
        1
    Kaiv2  
       2019-03-27 13:29:07 +08:00 via Android
    这。。。怎么联想的。不自信?
    whoami9894
        2
    whoami9894  
       2019-03-27 13:33:50 +08:00 via Android
    用哪种循环结构还不是看个人习惯,而且 Go 里只有个 for
    baronOvO
        3
    baronOvO  
       2019-03-27 13:34:34 +08:00 via Android
    有什么必然关系吗?
    适用场景的问题吧
    fngtz
        4
    fngtz  
       2019-03-27 13:36:18 +08:00 via iPhone   ❤️ 36
    没用过这个语句不能说明你菜。

    但是你这样想,大概率还是能说明你菜的。
    terence4444
        5
    terence4444  
       2019-03-27 13:41:15 +08:00
    我会尽量少用这种不确定循环次数的语句,用到就要非常小心退出条件。
    k8ser
        6
    k8ser  
    OP
       2019-03-27 14:04:41 +08:00
    谢谢大家,发帖前没有谨慎思考。本意是想知道大家有没有用到。挺常见但是自己几乎没有用到。
    watzds
        7
    watzds  
       2019-03-27 14:04:56 +08:00
    do {…} while(false) 见过吗
    th1nk
        8
    th1nk  
       2019-03-27 14:05:03 +08:00
    laravel 框架从来不用 else,牛逼不牛逼。
    k8ser
        9
    k8ser  
    OP
       2019-03-27 14:07:44 +08:00
    @watzds 没有
    @th1nk NB$L
    charliecheng
        10
    charliecheng  
       2019-03-27 14:13:41 +08:00
    我一般都用 try{} catch{}
    sugars
        11
    sugars  
       2019-03-27 14:14:27 +08:00
    不要为了用而用
    Raymon111111
        12
    Raymon111111  
       2019-03-27 14:15:29 +08:00
    4L 说的对
    Variazioni
        13
    Variazioni  
       2019-03-27 14:17:54 +08:00
    三年了。。表示也没用过。。甚至有时候需要先执行过程也想不起 do while。。一直都是用 for。。线程里的永真循环就用 while。。
    k9982874
        14
    k9982874  
       2019-03-27 14:19:35 +08:00
    do..while 在某些情况下函数内代码分块,划分变量作用域,替代 goto 还是很好用的
    binux
        15
    binux  
       2019-03-27 14:19:48 +08:00 via Android
    可以用来优化代码结构,但是不必要。
    arthas2234
        16
    arthas2234  
       2019-03-27 14:24:42 +08:00
    Java。。。一直用 foreach
    Febers
        17
    Febers  
       2019-03-27 14:26:48 +08:00 via iPhone
    用过一次,Java 的 readLine 判空读取文件,用 Kotlin 的时候只能写成 do...while
    Febers
        18
    Febers  
       2019-03-27 14:35:36 +08:00 via iPhone
    @Febers 其实也可以在循环里边 break,但是还是用了 do...while ~倒也说明了很不常用~~~
    zhuangzhuang1988
        19
    zhuangzhuang1988  
       2019-03-27 14:39:23 +08:00
    除了 c /c ++ 里 宏用过 别的地方从来没用过
    Mac
        20
    Mac  
       2019-03-27 14:40:27 +08:00 via Android
    还有人用几百万条 if then 开发游戏呢,能跑就行
    duql
        21
    duql  
       2019-03-27 14:46:20 +08:00
    很不喜欢在 do..while 里 break 来代替 goto 那种代码,增加了一层缩进,也没比 goto 清晰多少
    pkookp8
        22
    pkookp8  
       2019-03-27 14:53:17 +08:00 via Android   ❤️ 1
    真想打死说 goto 不好的人,代码结构是看写法,不是看关键字的
    逻辑混乱不用 goto 也混乱
    逻辑清晰 setjump 都能看的明明白白
    darknoll
        23
    darknoll  
       2019-03-27 14:56:12 +08:00
    do...while 不是用来循环的,用来写宏函数的
    mortonnex
        24
    mortonnex  
       2019-03-27 14:57:19 +08:00
    do {}
    while(false)

    这种写法爽的一匹
    galikeoy
        25
    galikeoy  
       2019-03-27 14:57:40 +08:00
    一直用 for 从来没用过 do...while
    des
        26
    des  
       2019-03-27 15:08:34 +08:00 via Android
    do {} while(false) 加 break,只用过这种
    notreami
        27
    notreami  
       2019-03-27 15:15:21 +08:00
    golang 码农表示,完全不知道还有这个玩法。。
    SuperMild
        28
    SuperMild  
       2019-03-27 15:21:22 +08:00
    其实基本上都用 for,连 while 都很少用到( C 语言除外)。
    LiHaiWordGe
        29
    LiHaiWordGe  
       2019-03-27 15:28:19 +08:00
    do {}
    while(false)

    shangfabao
        30
    shangfabao  
       2019-03-27 15:31:19 +08:00
    那你单用过 while 么?
    DOLLOR
        31
    DOLLOR  
       2019-03-27 15:32:13 +08:00
    其他语言不做评论,但是如果在 JS 里用 do{break}while(false)的话,那就真的太菜了,因为 JS 有更优雅的 labeled block 用法。
    k8ser
        32
    k8ser  
    OP
       2019-03-27 15:32:25 +08:00
    @shangfabao 记得用过,哈哈
    marsgt
        33
    marsgt  
       2019-03-27 15:33:25 +08:00
    是。
    下一个问题。😉
    marsgt
        34
    marsgt  
       2019-03-27 15:35:18 +08:00
    其实用不用无所谓吧,for 已经基本能满足 90%的场景了。前两天学 c 才知道,Go 语言里连 while 关键字都省了,直接抓 for 来兼职(不分段形式就是 while )……
    jinksw
        35
    jinksw  
       2019-03-27 15:35:22 +08:00
    C 语言会把这个用在定义宏上面
    因为 用别的实现不了

    🤔具体我忘了,不过我在书上看到过,在哪看到的忘了
    R4mble
        36
    R4mble  
       2019-03-27 15:36:01 +08:00
    我都不怎么用 while
    attackonFourier
        37
    attackonFourier  
       2019-03-27 15:38:13 +08:00
    js 循环都可以拿掉 用递归来代替
    cortexm3
        38
    cortexm3  
       2019-03-27 16:06:29 +08:00
    do {} while(0)
    firebroo
        39
    firebroo  
       2019-03-27 16:24:34 +08:00
    c/c++的宏吧。。
    qianji201712
        40
    qianji201712  
       2019-03-27 16:35:56 +08:00
    for foreach while 这三个就够了,do while 个人感觉使用怪怪的,主次颠倒了
    avenger
        41
    avenger  
       2019-03-27 16:39:18 +08:00 via iPhone
    goto 用过吗?;-)
    uleh
        42
    uleh  
       2019-03-27 17:09:35 +08:00
    说明你不是一个 C 程序员 :doge:
    0x11901
        43
    0x11901  
       2019-03-27 17:19:20 +08:00
    虽说这么想确实有点菜,不过讲道理的话还是要看看你用的是什么语言,如果需要编译开编译器优化的话,三种常见的循环结构最终机器码应该是一致的,不一致请去砍写编译器的人🔪
    0x11901
        44
    0x11901  
       2019-03-27 17:20:10 +08:00
    @0x11901 所以只是一个品味问题。
    bravecarrot
        45
    bravecarrot  
       2019-03-27 17:20:56 +08:00 via iPhone
    只用过 for 和 while
    工作一年了 do while 从没用过
    cpp 程序员
    zwh2698
        46
    zwh2698  
       2019-03-27 17:29:06 +08:00 via Android
    可以取消 goto 语句,优化流程。
    RyougiShiki
        47
    RyougiShiki  
       2019-03-27 17:31:52 +08:00
    所以 python 里没有它
    iffi
        48
    iffi  
       2019-03-27 17:34:28 +08:00
    可以用来重试,比较适合语意,即至少执行 1 次。do{请求}while(在重试次数限制范围内 && 第一次请求失败)
    inoki
        49
    inoki  
       2019-03-27 17:48:42 +08:00 via Android
    @watzds PHP src 里 zend engine 的 macro ?
    Akiyu
        50
    Akiyu  
       2019-03-27 17:54:15 +08:00
    我在真实环境下用到的 do{}while(false) 是为了那个 break
    在某一条件不成立的时候可以立马 break 出去
    Joyboo
        51
    Joyboo  
       2019-03-27 18:03:40 +08:00
    golang 一招 for 走天下
    YuTengjing
        52
    YuTengjing  
       2019-03-27 18:27:39 +08:00 via Android
    do while 场景有限,不过一年开发,如果是业务开发,讲道理是应该会碰到过
    xiangyuecn
        53
    xiangyuecn  
       2019-03-27 18:52:40 +08:00
    @watzds #7 do {…} while(false) 用的少,因为多了一个 do,记不住这么多语法。。。不过 while(true){... break}用的炒鸡多。
    herozzm
        54
    herozzm  
       2019-03-27 18:54:13 +08:00
    并不是,go 直接没有 do while,说明这个没有多少存在感
    Nicoco
        55
    Nicoco  
       2019-03-27 18:56:42 +08:00
    表示主力用 for,用 do { } while () 较少
    dremy
        56
    dremy  
       2019-03-27 18:57:21 +08:00 via iPhone
    do … where 用来做重试逻辑很方便啊,where 里面做是否需要重试的判断就好了
    meiyoumingzi6
        57
    meiyoumingzi6  
       2019-03-27 20:13:27 +08:00 via Android
    没用过

    可能因为我是个 python 猿
    bp0
        58
    bp0  
       2019-03-27 23:07:19 +08:00
    有些公司的编程规范要求函数不能多个 return,这时可以用 do{}while(0)加 break 模拟。

    另外一种情况就是正宗的 do while 用法,确实某些情况下需要先执行一次,然后再进行判断。
    yim7
        59
    yim7  
       2019-03-28 09:35:35 +08:00
    python 太菜了,没见过 do while
    qsbaq
        60
    qsbaq  
       2019-03-28 10:35:53 +08:00
    php 中从没用过 do while
    freedomshi
        61
    freedomshi  
       2019-03-28 11:00:27 +08:00
    chtcrack
        62
    chtcrack  
       2019-03-28 12:00:02 +08:00
    do while 和 for 差别很小的..for 写起来会比 do while 简单一些..看个人习惯吧.举例 int i=0;
    while(i<10)
    {
    i++;
    }
    上面的 while 和下面 for 其实执行的都是一个鸟样.
    for(int i=0;i<10;i++)
    {
    }
    jadeity
        63
    jadeity  
       2019-03-28 12:29:04 +08:00
    这就是个冗余的表达方式,存在但是没必要,所以 golang 只有一个 for (非褒非贬)。
    gamexg
        64
    gamexg  
       2019-03-28 12:50:33 +08:00
    go 里面只剩下了 for ...

    另外 c 里面虽然知道,但是印象真没用过。
    Paual
        65
    Paual  
       2019-03-28 13:13:06 +08:00
    do,while {} 可以进行重试机制吧,这个也是看大神的代码的时候看到的
    do {

    //进行相关操作

    } while ($this->result() !=0 $count<3) 可以进行重试机制,当函数 result 的结果不为 0,进行 do while 循环中的内容,也就是当函数结果没有执行成功的时候可以进行循环代码中的代码,也即重试机制
    Paual
        66
    Paual  
       2019-03-28 13:14:58 +08:00
    代码应该是这个:
    $count = 0;
    do {

    //进行相关操作

    } while ($this->result() !=0 && $count<3) 可以进行重试机制,当函数 result 的结果不为 0,进行 do while 循环中的内容,也就是当函数结果没有执行成功的时候可以进行循环代码中的代码,也即重试机制
    viger
        67
    viger  
       2019-03-28 14:54:12 +08:00
    do{}while(0)用的最多,主要是为了解决多层嵌套判断问题。
    当然如果有时候需要先执行一波再来判断的循环也会用到,不过这种场景比较少
    dearmymy
        68
    dearmymy  
       2019-03-28 17:47:56 +08:00
    我就是这么搞的,
    int liRet = -1
    do
    {
    liRet = doSomething()
    if(liRet !=0)
    break
    .....
    liRet = 0
    }while(false)
    return liRet
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3793 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 00:53 · PVG 08:53 · LAX 16:53 · JFK 19:53
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.