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

2019-01-22 12:01:23 +08:00
 garlics

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

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

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

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


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


看了大家的回复,感觉还是乖乖写 if 比较好,@learnshare 说的可读性优先
mooncakejs
2019-01-22 14:33:27 +08:00
js 和 php 里用的很多,c/java 里很少见。
lucifer9
2019-01-22 14:39:52 +08:00
喜欢这么用的话,投奔 Rust 吧
and_then, or_else 满足你
RqPS6rhmP3Nyn3Tm
2019-01-22 14:40:32 +08:00
没有 lazy evaluation 就炸了
Torpedo
2019-01-22 14:57:29 +08:00
@garlics js 里函数也很多。你要是写 jsx,没有 if,官方还推荐你这么写
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
2019-01-22 15:04:53 +08:00
像 if else 本身是英语,其语义不需思考已经形成条件反射了

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

但如果该写法在该语言不常见的话还是不要了,别人看了可能会懵一下
sosilver
2019-01-22 15:28:38 +08:00
@GeruzoniAnsasu 并不是,你看第六条。短路逻辑运算符类似 if/else。
GeruzoniAnsasu
2019-01-22 15:35:10 +08:00
@sosilver 试完发现我说错了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/529414

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX