关于条件运算符的结合性,很困惑的例子,谁能解释一下?

fantasy0126 2010-11-24 10:03:28
例子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
...全文
451 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
ipitxgu 2011-08-21
  • 打赏
  • 举报
回复
 条件运算符具有右结合性   
当一个表达式中出现多个条件运算符时,应该将位于最右边的问号与离它最近的冒号配对,并按这一原则正确区分各条件运算符的运算对象。   
例如:   w<x ? x+w : x<y ? x : y   
与 w<x ? x+w : ( x<y ? x : y) 等价   
与 (w<x ? x+w : x<y) ? x : y 不等价
sunyiz 2010-11-24
  • 打赏
  • 举报
回复
我们的老师只教过我们一句话
该加括号的地方你们给我加括号
别写个一大串挑战逻辑和程序的执行顺序

这样写出来的程序,结构清晰,可读性也高
fantasy0126 2010-11-24
  • 打赏
  • 举报
回复
呵呵,你的解释看起来很圆满,谢谢你啊.哎.可惜一些教材和自以为清楚不测代码的人一知半解地去教 别人.这真的很不好
zhuzeitou 2010-11-24
  • 打赏
  • 举报
回复
百度知道公司打开很慢,不过,这上面忽悠被忽悠不够多么?
zhuzeitou 2010-11-24
  • 打赏
  • 举报
回复
右结合不代表先算右边,只是代表某一部分是整体
对于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);和先计算那个并没有任何关系
fantasy0126 2010-11-24
  • 打赏
  • 举报
回复
也就是结论是在java中条件运算符--分拆成计算块的解释-->是从右往左分拆 (这体现在了右结合性)
但是计算时却是从左往右算的..--->这体现了什么??!!!
看看baidu知道.这个最佳答案在胡说吗
http://zhidao.baidu.com/question/76818376.html?si=1
zhangliang_00 2010-11-24
  • 打赏
  • 举报
回复
自己研究下 就懂了
dr_lou 2010-11-24
  • 打赏
  • 举报
回复
一点用没有,没人怎么写代码。

中国的教材啊。。。。
fantasy0126 2010-11-24
  • 打赏
  • 举报
回复
恩.看了4楼.可否说一下您理解的右结合? 就像例子2中的一样?
是的右结合,从右面往左看,就像五笔字根拆分中的取大优先?但是计算的时候却是从左往右算!!!不觉得这和一般的右结合不一样吗?
int a,b=5,c=5,d=3;
a=b=c+=++d;
System.out.println("a--->"+a);

这些语句都知道执行后a是9.如果也按照右结合性不一定先从右边开始算,a不就成了5了吗
y6372642 2010-11-24
  • 打赏
  • 举报
回复
例子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;
后面也是一样的,其实不用想太复杂,就是用一般算术方法从左到右注意判断式就好了。
zhuzeitou 2010-11-24
  • 打赏
  • 举报
回复
对于这个例子可能不明显,左、右结合的结果都一样,看下面这个
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
zhuzeitou 2010-11-24
  • 打赏
  • 举报
回复
3楼说错了,看4楼写的
你对右结合的理解错了
fantasy0126 2010-11-24
  • 打赏
  • 举报
回复
不一定吧,先算后面的语法上也没有问题 啊!!!毕竟是右结合,不为什么不按照语法书的规定来个右结合...jvm在干什么???java virtual machine的规范更新了吗
zhuzeitou 2010-11-24
  • 打赏
  • 举报
回复
前面说错了,是会产生二义性的,但右结合不代表先运算
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;左结合
zhuzeitou 2010-11-24
  • 打赏
  • 举报
回复
int c=a++>5?++a:--b>0?++a:--b;和int c=a++>5?++a:(--b>0?++a:--b);是一样的,只是省略了括号,因为即使不加括号也不存在二义性
你把这段转成语法树就看得出来只有这样转才能做到语法通过,否则语法是通不过的
fantasy0126 2010-11-24
  • 打赏
  • 举报
回复
感谢2楼.这样解释了结果,但条件运算符不是右结合性吗?????.这样符合结果的解释不成了左结合性了吗
zhuzeitou 2010-11-24
  • 打赏
  • 举报
回复
例子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

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧