Java 三元运算符结合性问题

表达式a > b ? b > c ? 1 : 0 : 2
?:是从右向左结合(右结合)的,那么该表达式被被解析为 a > b ? (b > c ? 1 : 0) : 2

上面的是我记忆中学的结合性的理解,但是今天看了一篇博客,执行了一下,让我差点怀疑人生,仔细想了一下,我原先的理解应该没问题,下面我记录一下:
Java中:条件表达式(三目运算符)的结合性是右结合,即自右向左结合
首先心中默算一下n的值,再实际运行一下n的值。

int i = -2;
int n = ++i == 0 ? 99 : i == -1 ? 11 : 22;

答案:n的值为11,怀疑人生~
原问题博客:https://blog.csdn.net/geekdonie/article/details/17173735
按照原博客的解释为:

int n = (++i == 0 ? 99 : i == -1) ? 11 : 22;

也即是按照if else语句执行的,这样解释也没什么毛病,但是和我所理解相冲突啊,细细想了一下,其实是这样的:
其实这个例子应该把其他运算符考虑进来就可以解释了:
(1)int i = -2;
(2)int n = ++i == 0 ? 99 : i == -1 ? 11 : 22;
首先(2)中优先级最高的是++运算符(从右向左),执行++i,设为A;接着是==运算符(从左向右),执行A == 0,设为B结果为false;接着B == -1,结果为true,此时的步骤2为int n = false ? 99 : true ? 11 : 22;现在是?:运算符(从右向左),也就是int n = false ? 99 : (true ? 11 : 22);这样的话n = 11;

若是哪里有理解错误的或写错的地方,望各位读者评论或者私信指正,不胜感激。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值