为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

饮歌长啸 2018-07-13 09:57:51
首先,书上说是自右向左,甚至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 回答

?
一只萌萌小番薯

TA贡献1795条经验 获得超7个赞

结果能出现1,说明确实是右结合,

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


查看完整回答
反对 回复 2018-07-14
?
九州编程

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,就算你括号括起来 顺序也还是不变


查看完整回答
反对 回复 2018-07-14
?
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))两种结合方式,所以第二种才是从右向左的结合方式,而表达式的执行顺序都是从左向右


查看完整回答
反对 回复 2018-07-14
?
汪汪一只猫

TA贡献1898条经验 获得超8个赞

为什么不加个括号呢,纠结这些个人感觉并没有实际的意义。兴许你觉得这涉及到原理什么的,可是编程时解决实际问题来着,并不是让你无谓的给自己增加困扰。

查看完整回答
反对 回复 2018-07-14
  • 4 回答
  • 0 关注
  • 2080 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信