例子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
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
解决方案 »
- 使用java的URLConnection下载网页,得到的网页内容不全的问题?
- java 环境变量中的classpath ,class_home 怎么配置
- 请问怎么将OpenJMS 邦定到 tomcat 上
- 请高手解决ant部署tomcat问题
- JCreator Pro如何配置啊? 谢谢
- thinking in java 例程中的一个问题
- result, rowset, cacheRowset 有什么区别?????,什么情况下区别着用?
- help
- 郁闷ing,散分
- 各位!拉兄弟一吧!谁有JB4.0的注册序列号????
- 关于使用 LZMA 压缩,被压缩文件名丢失问题
- 难道JDK1.7不支持SQL2000 抛弃了SQL2000????
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
你把这段转成语法树就看得出来只有这样转才能做到语法通过,否则语法是通不过的
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;左结合
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
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;
后面也是一样的,其实不用想太复杂,就是用一般算术方法从左到右注意判断式就好了。
是的右结合,从右面往左看,就像五笔字根拆分中的取大优先?但是计算的时候却是从左往右算!!!不觉得这和一般的右结合不一样吗?
int a,b=5,c=5,d=3;
a=b=c+=++d;
System.out.println("a--->"+a);这些语句都知道执行后a是9.如果也按照右结合性不一定先从右边开始算,a不就成了5了吗
但是计算时却是从左往右算的..--->这体现了什么??!!!
看看baidu知道.这个最佳答案在胡说吗
http://zhidao.baidu.com/question/76818376.html?si=1
对于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);和先计算那个并没有任何关系
当一个表达式中出现多个条件运算符时,应该将位于最右边的问号与离它最近的冒号配对,并按这一原则正确区分各条件运算符的运算对象。
例如: w<x ? x+w : x<y ? x : y
与 w<x ? x+w : ( x<y ? x : y) 等价
与 (w<x ? x+w : x<y) ? x : y 不等价