
String a = "a"; String b = "b"; String c = a + "_" + b==null?"":b; 上面的代码我一直以为 c 会返回 "a_b"
实际上却返回的是 "b" (+运算符优先级高于三目)
为啥我一直觉得 这样写没问题呢?
关键是我同事也有这种错觉。
1 GPLer Jun 12, 2019 via Android 没记错的话三目运算符的优先级是最低的,使用时本来就要注意加括号,之所以你认为没问题是因为错误的缩进。 |
2 rainmakeroly Jun 12, 2019 via Android 不是错觉,是二。有括号不用。 |
3 hoyixi Jun 12, 2019 这样写代码的早点开除,生活能更美好点 |
4 wucao219101 Jun 12, 2019 键盘上的括号是黄金按钮舍不得按吗?哈哈 |
5 zhaishunqi Jun 12, 2019 via iPhone 就是 b |
6 africwildman Jun 12, 2019 容易绕进去的代码还是用括号括一下保险。 |
7 anyele Jun 12, 2019 via Android 并不是 Java 的坑,是你写出来坑自己,坑别人 |
8 CEBBCAT Jun 12, 2019 虽然我算对了数了,但还是被标题偏进来了的,楼主你赢了 |
9 luozic Jun 12, 2019 via iPhone 括号不用? |
10 Takamine Jun 12, 2019 via Android Java:这个锅我不背。 如果对运算优先级不熟,请多加括号。:doge: |
11 iiii Jun 12, 2019 via Android 这能怪到 Java? |
12 potatowish Jun 12, 2019 看到这么写代码的,我会过去打死他 |
13 Leammin Jun 12, 2019 via Android idea 这样的有提示,我已经看到公司代码里好几处这样的写法了 |
14 Navee Jun 12, 2019 这不是语言的坑,你这个写法就有歧义 |
15 xrlin Jun 12, 2019 上一个这么写的已经被拖去打靶了 |
16 Ahaochan Jun 12, 2019 int i = 0; System.out.println(i++ + ++i + ++i); 请( |
17 itechify PRO 为啥不用括号。。。 |
18 vanhukset Jun 12, 2019 代码没有这么写的 |
19 Kilerd Jun 12, 2019 via iPhone 首先代码不会这么写,其次空格强行干扰优先级判断 |
20 Vegetable Jun 12, 2019 同一行,多个运算符时,除非各个运算符的优先级明显相同,也就是连续+-,连续* /,或者连续 and or 时,我才不用括号,否则为了可读性也要加上括号,这导致我其实对各个语言的运算符优先级都没什么认识,我需要优先级高的都用括号了 |
21 cheng6563 Jun 13, 2019 via iPhone 还真没遇到 int b=2; int a=b=3; 结果不是很清晰的? |
22 silentstorm Jun 13, 2019 via Android 神经病才这么写代码,纯属跟自己过不去。 |
23 kevinWHX Jun 13, 2019 via iPhone 按照大类,算数运算符 比较运算符 逻辑运算符 优先级依次降低 |
24 gramyang Jun 13, 2019 一般来说,烦了这个错误,悄悄的不做声,或者说自己看错了,然后下次改正就行了。。。。 理直气壮的说出来小心被优化啊 |
25 wozhizui Jun 13, 2019 有记和查运算优先级的时间,还不如加个括号,这哪是什么坑。 另外,我读的时候就是 b 啊。 Java 应该是最稳的老狗语言了。 |
26 AlphaStone Jun 13, 2019 没踩到,看一眼就知道是 b |
27 sonyxperia Jun 13, 2019 我从来都是用括号的,记什么优先级 |
28 cway Jun 13, 2019 肯定是 b 啊,搁谁第一眼都差不多是,没括号 a + "_" + b 就是一个整体 |
29 passerbytiny Jun 13, 2019 格式化后的代码: String a = "a"; String b = "b"; String c = a + "_" + b == null ? "" : b; 有时间破坏格式化,没时间加括号。 |
30 HENQIGUAI Jun 13, 2019 没加括号,空格也不好好用,规范都读哪儿去了? |
31 palmers Jun 13, 2019 |
32 Sornets Jun 13, 2019 面试最烦碰见这种 xx 题 |
33 simonv3ex Jun 13, 2019 a + "_" + b 就不等于 null 啊,所以结果是 b |
35 pkookp8 Jun 13, 2019 via Android 错觉来自于空格,请加上空格再看一遍 还有错觉搜索一下运算符优先级对着再看一遍 如果懒得看随便找一种语言跑一下这段代码,结果都一样 |
36 calming Jun 13, 2019 写这种代码自己心里过得去? |
38 yaoper Jun 13, 2019 自己造作的坑。 |
39 itmyhome126 Jun 13, 2019 这不是基础问题吗。。 |
40 zifangsky Jun 13, 2019 如果对运算优先级不熟,请多加括号! |
41 jinksw Jun 13, 2019 遇到过这个问题 一下就记住了 遇到之前 跟你想的一样 |
42 szq8014 Jun 13, 2019 这并不是坑,而是脑子有泡 |
43 ctsua Jun 13, 2019 不就是个三目吗 |
44 Banxiaozhuan Jun 13, 2019 小学生? |
45 ipwx Jun 13, 2019 不同优先级的运算符混用永远加括号。小学生都会的操作。。。 |
46 tonyli Jun 13, 2019 就是 b 啊,没毛病啊! |
48 iccfish Jun 13, 2019 这算啥坑,这是自己不懂吧。 |
49 FrankHB Jun 13, 2019 当优先级这种智熄设计遇到了 zz 用户就是这样个下场…… 被幼稚园数学毒害的中缀破烂语法扔了哪来那么多破事。 |
50 matthewxu123 Jun 13, 2019 初级题 |
51 beidounanxizi Jun 13, 2019 via iPhone go 就摒弃了这点 |
52 4everYang Jun 13, 2019 为什么会以为是 "a_b"呢? |
53 pmispig Jun 13, 2019 写这种代码的人还是早点开除吧 |
54 jamesliu96 Jun 13, 2019 via Android 佛了,返校重修吧 |
55 fxplay Jun 13, 2019 |
56 IllllI Jun 13, 2019 你这写的就是 B 你想表达什么 直说 |
57 sesmond Jun 13, 2019 我想说加个括号会 X 吗 |
58 KannaMakino Jun 13, 2019 via iPhone 还好吧,不过这么写有毒 |
59 way2create Jun 13, 2019 ...这种不叫坑吧 就是运算符优先级的问题,只能说基础不牢又不爱加括号了,我也经常忘,所以我加括号 |
60 flyingghost Jun 13, 2019 说实话,这个“坑”字的定义有问题。 坑,常用来描述反常理的,有 bug 的,太 trick 绝大多数人都不知道的旮旯。之所以是坑,就是绝大多数人都会掉进去。 而运算符优先级,既是常理,又没 bug,也一点 trick 都没有。这不是坑,这是基础知识存在盲点,是个人问题。 |
61 flyingghost Jun 13, 2019 另一个话题,虽然对于运算符优先级我就从来没记清过,但印象里凡是自带?:三目运算符的语言,好像都是超低优先级,都是排在+-*/之后。 所知语言有限,实在想不起例外。我尽力了。 |
62 jptx Jun 13, 2019 如果对这种运算符优先级不熟悉的话,直接一把括号走天下 |
63 HunterPan Jun 13, 2019 这样写 打死你,这是对别人负责 |
64 alikesi Jun 13, 2019 via Android 不用括号依靠记忆优先级和用汇编写代码有什么区别? |
65 auin Jun 13, 2019 你是我看到的第 N 个基础不牢,被三目“坑”的程序员 |
66 FrankHB Jun 13, 2019 @flyingghost 我发现所谓的优先级除了一个模棱两可的技术优势,剩下可以说毫无意义,全是跟风:因为历史既有以及别人习惯了这个设计,所以我也要用适应这种设计,即便根本说不清楚习惯是怎么来的,有哪些合理性。 这就是坑。反过来,分析清楚为什么这是个烂设计的思路,才是基础知识。 当然,你可以试着想想一下优点是什么,再做结论。 |
67 flyingghost Jun 26, 2019 @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:三目运算符优先级低于+加法双目运算符。 这样的例子还可以举下去。 我不知道大师们在设计语言的时候是否有类似的心路历程,但以我粗浅直观的感受来说,我对三目运算符优先级如此之低表示非常舒适非常满意。 |
68 FrankHB Jun 26, 2019 @flyingghost 你搞错了重点。我并没有说现在三目操作符的低优先级不合理,而是存在固定数量操作数的 ad-hoc 中缀语法整个就应该砍掉,这样根本就不需要纠结这样的问题了。 cf. github.com/FrankHB/pl-docs/blob/master/zh-CN/about-syntax.md 顺便,三目操作符实际是有你没提到的特别坑的地方的:??::嵌套。 |