首先,书上说的都是右结合性,甚至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)).”
但是,如果是右结合性,有什么办法证明吗?我试着写了如下代码,却发现结果似乎在向我诉说三目运算符是左结合性的
String s = "abc";
int y = 1;
System.out.println("abc".equals(s) ? 1 : (++y) == 2 ? 0 : -1);
System.out.println(y);//1
如果是自右向左的结合性,那么(++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。这显然是不正确的。