黑马程序员技术交流社区
标题:
(++x==y--&x++==1||--y==0) 这句话的运算
[打印本页]
作者:
攻城狮
时间:
2012-1-21 15:21
标题:
(++x==y--&x++==1||--y==0) 这句话的运算
本帖最后由 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
这样分析对么?
作者:
戴振良
时间:
2012-1-21 15:28
要想搞清楚这个,你首先得搞清楚运算符的优先级别
作者:
陈浩
时间:
2012-1-21 16:24
本帖最后由 陈浩 于 2012-1-21 16:29 编辑
首先在这个表达式里优先级最高的是“++”和“--”,然后是“==”,其次是“&”,最后是“||”,所以你可以把表达式以“||”为界分成两部分,而且运算顺序从左致右,先看“++X==Y--”,这里说明一点,“++X"不同于“X++”,前者的值是先自增而后被使用,后者是值先使用后自增。因此“==”左边的值为1,而右边的值也为1,则“&”左边为真,右边“X++==1”,由于X以被修改成1,所以此表达式也为真,这样“||”左边就为真,值得注意的是“||”有短路效果,即左边为真就不会运算右边,所以程序最后的结果是:2,0。我在补充一点,在程序运行完输出的结果是X自增两次,Y自减一次。
作者:
戴振良
时间:
2012-1-21 16:25
本帖最后由 戴振良 于 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。
我这个解释很详细吧,我写的不太标准,或许不是这样算的,但是原理大概是这样了,希望对你有帮助!
作者:
魏腾飞
时间:
2012-1-21 16:56
本帖最后由 魏腾飞 于 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的区别···
作者:
攻城狮
时间:
2012-1-21 17:35
(++x==y--&x++==1||--y==0)
(1==1 true (然后再-- = 0) ) & (比完再++ =2)1==1 true || --y==0)
( true & true ||(短路后面不运行) --y==0)
终于搞明白了 看了一遍视频 第二遍看的时候做练习发现这个问题没搞清楚 谢谢大家帮忙
作者:
房宝彬
时间:
2012-1-21 18:21
上面说了那么多解释,我就不说了,只要记住 运算顺序就OK,切记不要忽略了运算之后的结果,if判断为假,执行else
作者:
张冬冬
时间:
2012-1-21 23:42
这个等式完全就是楼主在自寻烦恼,如果你真有需要的可以加括号,我个人觉得这个问题可以避免,毕竟真实开发的时候,是不会有这样的问题发生的。
作者:
攻城狮
时间:
2012-1-22 02:06
张冬冬 发表于 2012-1-21 23:42
这个等式完全就是楼主在自寻烦恼,如果你真有需要的可以加括号,我个人觉得这个问题可以避免,毕竟真实开发 ...
这个是我下载毕老师视频里面文档的练习题复习的时候看到 不是我自己写的···
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2