V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
garlics
V2EX  ›  问与答

使用逻辑运算符代替 if 判断函数执行条件会不会被打?

  •  
  •   garlics · 2019-01-22 12:01:23 +08:00 · 3039 次点击
    这是一个创建于 2167 天前的主题,其中的信息可能已经有所发展或是发生改变。

    有时候只有一句话的判断的时候,不太想写 if,想用逻辑运算符代替,但是感觉这样可读性很差。大家能接受这种写法嘛?

        a && success()
        b || error()
    
    29 条回复    2019-01-22 17:33:24 +08:00
    dot2017
        1
    dot2017  
       2019-01-22 12:12:27 +08:00
    在你认为难读的地方加备注不就好了
    oott123
        2
    oott123  
       2019-01-22 12:12:29 +08:00 via Android
    这有个术语叫短路求值。
    不能接受。
    frylkrttj
        3
    frylkrttj  
       2019-01-22 12:13:08 +08:00
    感觉这是神操作
    rockyou12
        4
    rockyou12  
       2019-01-22 12:14:50 +08:00
    非常不好,一般读这种代码脑袋要转下弯,特别容易出 bug
    jifengg
        5
    jifengg  
       2019-01-22 12:23:33 +08:00
    一般我写自己用的代码,喜欢这么写。
    如果你的代码还要给别人看或者别人用,那不太推荐。再不然的话,多加点注释,有用的注释
    learnshare
        6
    learnshare  
       2019-01-22 12:26:03 +08:00   ❤️ 2
    可读性优先
    AlisaDestiny
        7
    AlisaDestiny  
       2019-01-22 13:02:51 +08:00
    写 js 的话常用。
    比如在调用回调函数的时候 cb && cb(data); 或者为了解决某些兼容性问题的时候 a = a || aa;
    Torpedo
        8
    Torpedo  
       2019-01-22 13:03:23 +08:00 via Android
    js 里常规操作。。。
    msg7086
        9
    msg7086  
       2019-01-22 13:06:16 +08:00   ❤️ 2
    你这么写的话可读性就很差了。

    有些语言可以这么写:
    send_email and show_success(xx)
    connect_db or show_error(xx)
    原生英语语法,读起来就很舒服了。
    regist
        10
    regist  
       2019-01-22 13:14:54 +08:00 via iPhone
    Gentoo 的 ebuild 脚本,一直这么写
    rabbbit
        11
    rabbbit  
       2019-01-22 13:44:04 +08:00
    一般用来做判断加个注释应该没啥问题

    要是这么写还不加注释估计会被打
    num = (123.45 + 888) / 10 | 0
    num & 1 && num--
    garlics
        12
    garlics  
    OP
       2019-01-22 14:30:07 +08:00
    @dot2017
    @jifengg
    @rabbbit
    这样写主要为了方便,加注释就更不方便了


    @AlisaDestiny
    @Torpedo
    js 里见到的是 a && a.xxx 比较多,这种调用函数的操作很少


    看了大家的回复,感觉还是乖乖写 if 比较好,@learnshare 说的可读性优先
    mooncakejs
        13
    mooncakejs  
       2019-01-22 14:33:27 +08:00
    js 和 php 里用的很多,c/java 里很少见。
    lucifer9
        14
    lucifer9  
       2019-01-22 14:39:52 +08:00
    喜欢这么用的话,投奔 Rust 吧
    and_then, or_else 满足你
    RqPS6rhmP3Nyn3Tm
        15
    RqPS6rhmP3Nyn3Tm  
       2019-01-22 14:40:32 +08:00 via iPhone
    没有 lazy evaluation 就炸了
    Torpedo
        16
    Torpedo  
       2019-01-22 14:57:29 +08:00 via Android
    @garlics js 里函数也很多。你要是写 jsx,没有 if,官方还推荐你这么写
    GeruzoniAnsasu
        17
    GeruzoniAnsasu  
       2019-01-22 14:57:57 +08:00
    拿 c++来说,这种写法有个很严重的问题就是求值要先于运算符

    https://zh.cppreference.com/w/cpp/language/eval_order
    2) 任何运算符的运算数的值计算(但非副效应)先序于运算符结果的值计算(但非副效应)。

    && 右边的 sucess()函数必定会先调用,得出结果后,才会进行&&比较,而如果 success 是个 void 类型,此处甚至无法编译,所以 C/JAVA 里不可能见到这种写法,语义上都无法成立


    只在 shell 脚本里见过 [ xxx ] && do_sth
    nichijou
        18
    nichijou  
       2019-01-22 15:04:53 +08:00
    像 if else 本身是英语,其语义不需思考已经形成条件反射了

    而这种写法在如果该语言很常见比如 Perl,因为用得多所以可以放心使用

    但如果该写法在该语言不常见的话还是不要了,别人看了可能会懵一下
    sosilver
        19
    sosilver  
       2019-01-22 15:28:38 +08:00 via Android
    @GeruzoniAnsasu 并不是,你看第六条。短路逻辑运算符类似 if/else。
    GeruzoniAnsasu
        20
    GeruzoniAnsasu  
       2019-01-22 15:35:10 +08:00
    @sosilver 试完发现我说错了
    maomo
        21
    maomo  
       2019-01-22 15:42:25 +08:00
    会不会被打取决于看代码的人喜不喜欢做逻辑题
    jookr
        22
    jookr  
       2019-01-22 15:46:52 +08:00
    我拍黄片经常这么写
    ```
    !$var && $this->error('报错');
    $insert['name'] = input('post.name/s') ?: $this->error('name 获取失败');
    ```
    littleylv
        23
    littleylv  
       2019-01-22 15:47:26 +08:00
    if (a) {
    success();
    }
    可以说我今天写了 3000 行代码。
    a && success()
    只能说我今天写了 1000 行代码。

    (狗头
    arthas2234
        24
    arthas2234  
       2019-01-22 15:49:23 +08:00
    比较忙或者脑子不太清醒的时候,容易翻车
    shyangs
        25
    shyangs  
       2019-01-22 16:39:36 +08:00
    JS 里常规操作

    ```

    var locale = navigator.language || navigator.browserLanguage;

    ```
    meiguo10086
        26
    meiguo10086  
       2019-01-22 17:13:22 +08:00
    js 常见 不会被打。不过还是建议用 if 抱起来 多不了多少代码。但是很优雅可读性高。貌似很多大佬都建议包起来
    grewer
        27
    grewer  
       2019-01-22 17:20:06 +08:00
    我也 觉得是常规操作 习惯了之后 可读性不是问题 写得也快点..
    jsq2627
        28
    jsq2627  
       2019-01-22 17:29:26 +08:00
    JS 的常规操作,特别是空值检测和 JSX 里面条件分支
    libook
        29
    libook  
       2019-01-22 17:33:24 +08:00
    可读性优先,不推荐这么写。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   946 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 20:19 · PVG 04:19 · LAX 12:19 · JFK 15:19
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.