例子1
        int a=6;
int b=1;
int c=a++>6?++a:--b>=0?++a:--b;
System.out.println("a-->"+a+"\nb-->"+b+"\nc-->"+c);
结果:
a-->8
b-->0
c-->8我的体会:
如果真的是右结合,应该先算--b>=0?++a:--b
这样因为--b>=0成立,应该算++a算完之后,a为7,b为0表达式的值为7
再算a++>6?++a:7
这样a的值应该是9,c也应该是9因为最后是++a嘛
例子2
int a=6;
int b=1;
int c=a++>5?++a:--b>0?++a:--b;
System.out.println("a-->"+a+"\nb-->"+b+"\n-->"+c);结果:
a-->8
b-->1
-->8我觉得应该先算--b>0?++a:--b这样算完之后b为-1,再算a++>5?++a:-1这样8c为8
但结果不是这样啊
例子3 int a=6;
int b=1;
int c=a++>6?++a:--b>0?++a:--b;
System.out.println("a-->"+a+"\nb-->"+b+"\nc-->"+c);结果:
a-->7
b-->-1
c-->-1

解决方案 »

  1.   

    例子1
    int a=6;
    int b=1;
    int c=a++>6?++a:--b>=0?++a:--b;a b c
    6 1 起始
    7 1 判断a++>6,为false
    7 0 判断--b>0,为true
    8 0 8 执行c=++a例子2
    int a=6;
    int b=1;
    int c=a++>5?++a:--b>0?++a:--b;a b c
    6 1 起始
    7 1 判断a++>5,为true
    8 1 8 执行c=++a例子3
    int a=6;
    int b=1;
    int c=a++>6?++a:--b>0?++a:--b;a b c
    6 1 起始
    7 1 判断a++>6,为false
    7 0 判断--b>0,为false
    7 -1 -1 执行c=--b
      

  2.   

    int c=a++>5?++a:--b>0?++a:--b;和int c=a++>5?++a:(--b>0?++a:--b);是一样的,只是省略了括号,因为即使不加括号也不存在二义性
    你把这段转成语法树就看得出来只有这样转才能做到语法通过,否则语法是通不过的
      

  3.   

    前面说错了,是会产生二义性的,但右结合不代表先运算
    int c=a++>5?++a:--b>0?++a:--b;
    int c=a++>5?++a:(--b>0?++a:--b);右结合
    int c=(a++>5?++a:--b)>0?++a:--b;左结合
      

  4.   

    不一定吧,先算后面的语法上也没有问题 啊!!!毕竟是右结合,不为什么不按照语法书的规定来个右结合...jvm在干什么???java virtual machine的规范更新了吗
      

  5.   

    对于这个例子可能不明显,左、右结合的结果都一样,看下面这个
    int a = 1;
    int b = 1;
    int c = a++ > 0 ? ++a : --b > 0 ? ++a : --b;如果是右结合,就是int c = a++ > 0 ? ++a : (--b > 0 ? ++a : --b);
    那么
    a b c
    1 1 起始
    2 1 判断a++>0,为true
    3 1 3  执行c=++a但如果是左结合,就是int c = (a++ > 0 ? ++a : --b) > 0 ? ++a : --b;
    那么
    a b c 中间数
    1 1 起始
    2 1 判断a++>0,为true
    3 1 3 执行++a
    3 1 3 判断中间数>0,为true
    4 1 4 3 执行++a
      

  6.   

    例子1
    int a=6;
    int b=1;
    int c=a++>6?++a:--b>=0?++a:--b;
    System.out.println("a-->"+a+"\nb-->"+b+"\nc-->"+c);
    c=a++>6?判断为false,a+1=7,--b=0,>=0,为true,所以c=++a=7+1=8,b=0.
    结果:
    a-->8
    b-->0
    c-->8;
    后面也是一样的,其实不用想太复杂,就是用一般算术方法从左到右注意判断式就好了。
      

  7.   

    恩.看了4楼.可否说一下您理解的右结合?      就像例子2中的一样? 
    是的右结合,从右面往左看,就像五笔字根拆分中的取大优先?但是计算的时候却是从左往右算!!!不觉得这和一般的右结合不一样吗?
    int a,b=5,c=5,d=3;
    a=b=c+=++d;
    System.out.println("a--->"+a);这些语句都知道执行后a是9.如果也按照右结合性不一定先从右边开始算,a不就成了5了吗
      

  8.   

    也就是结论是在java中条件运算符--分拆成计算块的解释-->是从右往左分拆  (这体现在了右结合性)
    但是计算时却是从左往右算的..--->这体现了什么??!!!
    看看baidu知道.这个最佳答案在胡说吗
    http://zhidao.baidu.com/question/76818376.html?si=1
      

  9.   

    右结合不代表先算右边,只是代表某一部分是整体
    对于a=b=c+=++d;,根据右结合,就是a=(b=(c+=(++d)));那么要计算a就要得到b,要计算b就要得到c,要计算c要得到d的值,这是个特例,正好满足计算顺序也是从右至左而已
    对于int c=a++>5?++a:--b>0?++a:--b;右结合说明优先把右边的部分是为一个整体,就是int c=a++>5?++a:(--b>0?++a:--b);和先计算那个并没有任何关系
      

  10.   

     条件运算符具有右结合性   
    当一个表达式中出现多个条件运算符时,应该将位于最右边的问号与离它最近的冒号配对,并按这一原则正确区分各条件运算符的运算对象。   
    例如:   w<x ? x+w : x<y ? x : y   
    与 w<x ? x+w : ( x<y ? x : y) 等价   
    与 (w<x ? x+w : x<y) ? x : y 不等价