A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 攻城狮 黑马帝   /  2012-1-21 15:21  /  2482 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 spiritleak 于 2012-1-21 17:36 编辑

class Demo1
{
        public static void main(String[] args)
        {
                int x=0,y=1;
                if(++x==y--&x++==1||--y==0)
                        System.out.println("x="+x+",y="+y);
                else
                        System.out.println("y="+y+",x="+x);
        }
}

程序运行后的结果是 x=2 ,y=0 但是没看明白是怎么来的
(++x==y--&x++==1||--y==0)
主要理不清这句话怎么比较判断

书上写的 ++ 优先级大于== 然后==大于& ,&大于||
(++x==y--&x++==1||--y==0)
(     1==0   &2     ==1||0==0)// ++x==y--&x++==1 这是第一部分运算||--y==0 这是第二部分运算所以这里的Y还是1不是前面部分运算后的0 所以 x=2 y=0  
(false||true) //一真则真 所以 答案是 x=2 y=0   这样分析对么?

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

8 个回复

倒序浏览
要想搞清楚这个,你首先得搞清楚运算符的优先级别
回复 使用道具 举报
陈浩 来自手机 黑马帝 2012-1-21 16:24:09
藤椅
本帖最后由 陈浩 于 2012-1-21 16:29 编辑

首先在这个表达式里优先级最高的是“++”和“--”,然后是“==”,其次是“&”,最后是“||”,所以你可以把表达式以“||”为界分成两部分,而且运算顺序从左致右,先看“++X==Y--”,这里说明一点,“++X"不同于“X++”,前者的值是先自增而后被使用,后者是值先使用后自增。因此“==”左边的值为1,而右边的值也为1,则“&”左边为真,右边“X++==1”,由于X以被修改成1,所以此表达式也为真,这样“||”左边就为真,值得注意的是“||”有短路效果,即左边为真就不会运算右边,所以程序最后的结果是:2,0。我在补充一点,在程序运行完输出的结果是X自增两次,Y自减一次。

评分

参与人数 1技术分 +1 收起 理由
祁焱 + 1 赞一个!

查看全部评分

回复 使用道具 举报
本帖最后由 戴振良 于 2012-1-21 16:34 编辑

++/--   ==    &    ||(运算符从左到右优先级为从高到低)
(++x)==(y--)     &     (x++)==1     ||     (--y)==0 (为了方面观看我多加了一些空格)
   0   ==   0        &          1  ==1      ||    (--y)==0
                                        真            ||     (--y)==0

解释:
1、总是有人说,有什么不懂的先问百度,我刚刚百度了一下,了解到你以上所用的的运算符优先级别为:++/-- 高于 == 高于 & 高于  ||
2、根据以上优先级可写成这样:(++x)==(y--)     &     (x++)==1     ||     (--y)==0。
3、进一步解上面的题,按顺序先说++x,因为这里++是在前面,所以表达式先使用的是x未自减的值,此时x=0,而后x++,因为加加在后面,则表达式使用的是x自加1后的值,此时x=1;而y--,因为--在后面,所以表达式使用的是y自减后的值,些时y=0;计算后得到:
0   ==   0      &          1  ==1     ||   (--y)==0 ,这条表达式执行完后,因为++x是前加加,所以执行了表达式后,x的值才自加1,所以x等于2
4,进一步简化后变成:真 & 真    ||    (--y)==0
5,再进一步计算为:真|| (--y)==0,  此时要说一下短路或||,只要有一边为真,则整个表达式的值为真,而且当||左边的表达式为真时就可以确定整个表达式的值为真了不会再执行||右边的是表达式,所以(--y)==0这个表达式从来就没有被执行过,所以这一步确定了表达式的值为真,那就就执行了if为真的那个语句(System.out.println("x="+x+",y="+y);),
所以最终x的值为2,y的值为0。
我这个解释很详细吧,我写的不太标准,或许不是这样算的,但是原理大概是这样了,希望对你有帮助!

评分

参与人数 1技术分 +1 收起 理由
祁焱 + 1 赞一个!

查看全部评分

回复 使用道具 举报
本帖最后由 魏腾飞 于 2012-1-21 16:58 编辑

/*
如何理解判断条件:
1.++x  整体结果为1,x=1;
2.y--  整体结果为1,y=0;
3.两者相等,成立true
4.x++ 原x=1,整体为1,x=2;
5.x++==1 整体正确所以||右侧不在计算 y=0;
6.所以直接执行,System.out.println("x=" + x + ",y=" + y);
*/
希望楼主弄明白x++和++x的区别···

评分

参与人数 1技术分 +1 收起 理由
祁焱 + 1 赞一个!

查看全部评分

回复 使用道具 举报
(++x==y--&x++==1||--y==0)
(1==1  true (然后再--  = 0) ) & (比完再++ =2)1==1 true || --y==0)
( true & true ||(短路后面不运行) --y==0)

终于搞明白了  看了一遍视频 第二遍看的时候做练习发现这个问题没搞清楚 谢谢大家帮忙   

评分

参与人数 1技术分 +1 收起 理由
祁焱 + 1 赞一个!

查看全部评分

回复 使用道具 举报
房宝彬 黑马帝 2012-1-21 18:21:29
7#
上面说了那么多解释,我就不说了,只要记住 运算顺序就OK,切记不要忽略了运算之后的结果,if判断为假,执行else
回复 使用道具 举报
张冬冬 黑马帝 2012-1-21 23:42:00
8#
这个等式完全就是楼主在自寻烦恼,如果你真有需要的可以加括号,我个人觉得这个问题可以避免,毕竟真实开发的时候,是不会有这样的问题发生的。

评分

参与人数 1黑马币 +3 收起 理由
荣凯旋 + 3

查看全部评分

回复 使用道具 举报
攻城狮 黑马帝 2012-1-22 02:06:29
9#
张冬冬 发表于 2012-1-21 23:42
这个等式完全就是楼主在自寻烦恼,如果你真有需要的可以加括号,我个人觉得这个问题可以避免,毕竟真实开发 ...

这个是我下载毕老师视频里面文档的练习题复习的时候看到 不是我自己写的···
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马