使用逻辑运算符代替 if 判断函数执行条件会不会被打? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
garlics
V2EX    问与答

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

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

    有时候只有一句话的判断的时候,不太想写 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 获取失败');
    ```
    U7Q5tLAex2FI0o0g
        23
    U7Q5tLAex2FI0o0g  
       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     Solana     2510 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 30ms UTC 15:35 PVG 23:35 LAX 08:35 JFK 11:35
    Do have faith in what you're doing.
    ubao 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