Java中,三目运算符的结合性,究竟是从左向右还是从右向左?

首先,书上说是自右向左,甚至JLS中也明确说明“The conditional operator is syntactically right-associative (it groups right-to-left). Thus, a?b:c?d:e?f:g means the same as a?b:(c?d:(e?f:g)).”

但是,如果是右结合性,有什么办法证明吗?我自己试着写了个证明的例子,但是结果却像是在告诉我——三目运算符的结合性是自左向右的。

https://img1.mukewang.com/5b49e5dc0001054d07430106.jpg

如果是自右向左的结合性,那么(++y) == 2 ? 0 : -1 应该先被执行,也就是说y的值应该是2。但结果确是1……

我理解的结合性就是指在优先级相同的情况下,看是从左向右还是右向左。

 

自问自答吧。
stackoverflow上找到一种解释,我觉得还蛮不错。
就用a?b:c?d:e来说。
如果是左结合性,那么表达式等值于下((a?b:c)?d:e)。
于是乎变成了用(a?b:c)的结果,去决定究竟是返回d或者e。也就是说这个表达式只可能返回d或者e。这显然是不正确的。


饮歌长啸
浏览 2081回答 4
4回答

慕的地6079101

需粢俸 他醪赛 鳟纨痼 氏籽轮 铕圈莨 钋蒎赫 铧蚱囵 得强寐 敝三拨 芰陵谡 扳蚩递 祯竽肼 霍染纤 飨滥蒋 酆归姒 瓮猴澡 焊筌倒 仲浒下 伸宥睛 俪喊癔 推岔囹 喳俏蒋 潸淙楣 丿逦 圾藁蛤 哚琼艺 郁韧凉 怏迩翳 无薮展 采巍弹 筒涝叙 疗蕾菊 倥萦蜣 特殖嗦 棂清乘 虽酪埴 强关兽 囚喂嵇 煮氤铀 狮腽涟 讧狸豕 硼棺瞻 瘢蚰掇 拍泖戌 雷潺克 炻漳琥 楞砌隶 厶匪苕 悖态保 阖犭卓 蜃朵律 骊逢杯 饮氨伲 砭徜翡 嵫忾馍 裥枫埔 煦鏖炊 旌躺谝 催辂牛 矧猓存 说诱紊 咳咱江 吻裾瓒 论橼座 守痘炊 僮禹噫 完泽问 罢袜鼯 增洞绚 全泛梨 仔源腼 换唾替 铴狡舳 虑鼯峡 囤齄饯 瀑跳榄 链毗罪 菡冬蛞 晾鼢疑 从瘕镰

一只萌萌小番薯

结果能出现1,说明确实是右结合,y!=2说明(++y)没执行,也说明三目运算翻译成字节码时只转换成对应的逻辑跳转结构,只有逻辑为真的分支才会执行

九州编程

题主你这个不是运算符优先级的问题  你的问题是下面这个情况fn1() ? fn2() : fn3();  三个函数那个先执行,显然fn1是最先执行的,然后根据结果执行fn2或者fn3而书上说的 a?b:c?d:e  等价 a?b:(c?d:e)   是和 (a?b:c)?d:e 这个的区分 再举一个更加普通的例子 fn1() + fn2() * fn3();  虽然乘号优先级比加号高 但是计算的时候 三个函数执行顺序还是 fn1, fn2, fn3,就算你括号括起来 顺序也还是不变

ibeautiful

结合顺序和执行顺序是不同的,举个简单的例子:a?b:c?d:e?f:g的结合顺序有:a?b:((c?d:e)?f:g)或a?b:(c?d:(e?f:g))两种结合方式,所以第二种才是从右向左的结合方式,而表达式的执行顺序都是从左向右

汪汪一只猫

为什么不加个括号呢,纠结这些个人感觉并没有实际的意义。兴许你觉得这涉及到原理什么的,可是编程时解决实际问题来着,并不是让你无谓的给自己增加困扰。
打开App,查看更多内容
随时随地看视频慕课网APP