首先,书上说是自右向左,甚至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)).”但是,如果是右结合性,有什么办法证明吗?我自己试着写了个证明的例子,但是结果却像是在告诉我——三目运算符的结合性是自左向右的。如果是自右向左的结合性,那么(++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。这显然是不正确的。
4 回答
慕的地6079101
TA贡献3593条经验 获得超0个赞
需粢俸
他醪赛
鳟纨痼
氏籽轮
铕圈莨
钋蒎赫
铧蚱囵
得强寐
敝三拨
芰陵谡
扳蚩递
祯竽肼
霍染纤
飨滥蒋
酆归姒
瓮猴澡
焊筌倒
仲浒下
伸宥睛
俪喊癔
推岔囹
喳俏蒋
潸淙楣
丿逦
圾藁蛤
哚琼艺
郁韧凉
怏迩翳
无薮展
采巍弹
筒涝叙
疗蕾菊
倥萦蜣
特殖嗦
棂清乘
虽酪埴
强关兽
囚喂嵇
煮氤铀
狮腽涟
讧狸豕
硼棺瞻
瘢蚰掇
拍泖戌
雷潺克
炻漳琥
楞砌隶
厶匪苕
悖态保
阖犭卓
蜃朵律
骊逢杯
饮氨伲
砭徜翡
嵫忾馍
裥枫埔
煦鏖炊
旌躺谝
催辂牛
矧猓存
说诱紊
咳咱江
吻裾瓒
论橼座
守痘炊
僮禹噫
完泽问
罢袜鼯
增洞绚
全泛梨
仔源腼
换唾替
铴狡舳
虑鼯峡
囤齄饯
瀑跳榄
链毗罪
菡冬蛞
晾鼢疑
从瘕镰
九州编程
TA贡献1785条经验 获得超4个赞
题主你这个不是运算符优先级的问题
你的问题是下面这个情况
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
TA贡献1993条经验 获得超5个赞
结合顺序和执行顺序是不同的,举个简单的例子:
a?b:c?d:e?f:g的结合顺序有:a?b:((c?d:e)?f:g)或a?b:(c?d:(e?f:g))两种结合方式,所以第二种才是从右向左的结合方式,而表达式的执行顺序都是从左向右
- 4 回答
- 0 关注
- 2080 浏览
添加回答
举报
0/150
提交
取消