Java : 踩过这个坑没?

2019-06-12 20:41:30 +08:00
 oska117
String a = "a";

String b = "b";

String c = a + "_" + b==null?"":b;

上面的代码我一直以为 c 会返回 "a_b"

实际上却返回的是 "b" (+运算符优先级高于三目)

为啥我一直觉得 这样写没问题呢?

关键是我同事也有这种错觉。

6497 次点击
所在节点    程序员
68 条回复
flyingghost
2019-06-13 18:34:48 +08:00
另一个话题,虽然对于运算符优先级我就从来没记清过,但印象里凡是自带?:三目运算符的语言,好像都是超低优先级,都是排在+-*/之后。
所知语言有限,实在想不起例外。我尽力了。
jptx
2019-06-13 19:15:31 +08:00
如果对这种运算符优先级不熟悉的话,直接一把括号走天下
HunterPan
2019-06-13 19:28:58 +08:00
这样写 打死你,这是对别人负责
alikesi
2019-06-13 19:29:48 +08:00
不用括号依靠记忆优先级和用汇编写代码有什么区别?
liuxey
2019-06-13 19:32:26 +08:00
你是我看到的第 N 个基础不牢,被三目“坑”的程序员
FrankHB
2019-06-13 23:57:34 +08:00
@flyingghost 我发现所谓的优先级除了一个模棱两可的技术优势,剩下可以说毫无意义,全是跟风:因为历史既有以及别人习惯了这个设计,所以我也要用适应这种设计,即便根本说不清楚习惯是怎么来的,有哪些合理性。
这就是坑。反过来,分析清楚为什么这是个烂设计的思路,才是基础知识。
当然,你可以试着想想一下优点是什么,再做结论。
flyingghost
2019-06-26 00:11:28 +08:00
@FrankHB 说分析就分析。
不要思考,不要先验,不要预定义优先级。如果我们引入了?:运算符来简化 if/else,来试试凭直觉猜测以下 y=f(x)函数的意图。

y = x >= 0 ? 0 : 1
猜它是想干嘛?
A,三目运算符具有高优先级。y = x >= (0 ? 0 : 1) => y = x >= 1 => 根据 x 是否大于等于 1 得到 bool 值。这个例子中 (0 ? 0 : 1) 表达式其实非常不稳定,条件为 0 则永假,条件为非 0 则永真,在 int 不能自动转型 bool 的强类型语言中则直接挂。
B,三目运算符具有低优先级。y = (x >= 0) ? 0 : 1 => 根据 x 是否大于等于 0 得到 y 为 x 的符号位 0 或 1。
显然方案 B 容易理解比较合理并且稳定可预期。结论 1:三目运算符优先级低于比较运算符。

再来一个。
y = condition ? x : x +1
猜它是想干嘛?
A,三目运算符具有高优先级。y = (condition ? x : x) +1 => y = x + 1,condition 在这里毫无意义。
B,三目运算符具有低优先级。y = condition ? x : (x+1) ,条件成立则 y=x,否则 y=x+1。
显然方案 B 容易理解比较直观。结论 2:三目运算符优先级低于+加法双目运算符。

这样的例子还可以举下去。
我不知道大师们在设计语言的时候是否有类似的心路历程,但以我粗浅直观的感受来说,我对三目运算符优先级如此之低表示非常舒适非常满意。
FrankHB
2019-06-26 20:19:52 +08:00
@flyingghost 你搞错了重点。我并没有说现在三目操作符的低优先级不合理,而是存在固定数量操作数的 ad-hoc 中缀语法整个就应该砍掉,这样根本就不需要纠结这样的问题了。

cf. github.com/FrankHB/pl-docs/blob/master/zh-CN/about-syntax.md

顺便,三目操作符实际是有你没提到的特别坑的地方的:??::嵌套。

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

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

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

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

© 2021 V2EX