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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李海鹏 中级黑马   /  2013-1-15 20:04  /  1915 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 张向辉 于 2013-1-16 10:57 编辑

class Demo
{
        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);
        }
}
if里面不是只是条件吗?难道还运算吗?

评分

参与人数 1黑马币 +9 收起 理由
Rancho_Gump + 9 赞一个!

查看全部评分

8 个回复

倒序浏览
当然会运算啊,变量 x,y 随时在栈区里改变呢
在条件表示里返回值只有false和ture两种,LZ这里自增(自减)和逻辑表达式组合,条件里在两个变量 x,y 在判断的时候,一直在修改
栈区分配的x,y的值,你声明的变量不是static的,是冬天,随时都修改它的初始值

评分

参与人数 1黑马币 +9 收起 理由
Rancho_Gump + 9 赞一个!

查看全部评分

回复 使用道具 举报


{:soso_e127:}上面的字打错了,改成是动态了滴
回复 使用道具 举报
if括号中有++x(先自增再运算),y--(先运算再自减),x++(先运算再自增),--y(先自减再运算)的运算,所以判断if是否成立看的是这些运算完成后产生的值是真还是假了。

评分

参与人数 1黑马币 +9 收起 理由
Rancho_Gump + 9 赞一个!

查看全部评分

回复 使用道具 举报
if里面需要判断出结果,是真还是假?是真就会执行
System.out.println("x="+x+",y="+y);
是假 就会执行
System.out.println("y="+y+",x="+x);
但是逻辑运算在运算的时候,会把局部变量x,y的值在堆内存中改变,所以会打印出不同的结果
运行结果是x=2,y=0

评分

参与人数 1黑马币 +9 收起 理由
Rancho_Gump + 9 赞一个!

查看全部评分

回复 使用道具 举报
{:soso_e101:}这个是要进行运算的,因为IF循环里面的运算顺序在进行啊
回复 使用道具 举报
本帖最后由 黑马刘杰 于 2013-1-15 20:31 编辑

if里面的判别式是有运算的
  1. public class Demo {
  2.         public static void main(String[] args) {
  3.                 int x = 0, y = 1;
  4.                 //首先,==优先级大于&,&没有短路作用,++x是先运算后引用,x++是先引用后运算
  5.                 //++x==y--,可以这样理解,分为两步(++x)==y;y--;这里得出TRUE,x值变为1,y的值变为0
  6.                 //x++==1,即x==1;x++;得出TRUE,x值变为2
  7.                 //||具有短路特点,后面的就不执行了,判别式即为TRUE
  8.                 if (++x == y-- & x++ == 1 || --y == 0)
  9.                         System.out.println("x=" + x + ",y=" + y);
  10.                 else
  11.                         System.out.println("y=" + y + ",x=" + x);
  12.         }
  13. }
复制代码

评分

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

查看全部评分

回复 使用道具 举报
我们先来搞清楚这里面涉及到的几个运算符的优先级
++、--同优先级 > ==  > &  >||
知道优先级后,其加上括号的等式就变为(((++x) == (y--)) & ((x++) == 1)) ||((--y) == 0);
接着我们就得了解++,--运算符的使用方式
++在变量之前,变量需先加上1再参加运算,如i = 2; ++i = 3; i = 3,++在变量之后,变量需先参加运算再加1,如i = 2; i++ = 2; i = 3
--运算符同理。
好了,有了这些,我们就开始来计算上面的那个表达式。
首先++x = 1,x = 1;  y-- = 1 , y = 0所以(++x == y--)为真,注意x的值变为了1, y的值变为了0,接着计算后面的
x++ = 1, x = 2,所以x++ = = 1为真,(((++x) == (y--)) & ((x++) == 1)) 其结果为1,因为不为0,在||运算符之前,||就会进行短路运算,即后面的表达式不会再进行运算y还是为0,整个表达式结果为真。
最后的运行结果就为x=2,y=0

评分

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

查看全部评分

回复 使用道具 举报
你问的问题,郁闷了。
if(条件表达式)
里面可以进行运算,最后只能为true或者flase。
最后要是比较运算符
例如 if (a =b)这是赋值运算

if (a+1==b) 这个最后是==(比较运算符)
结果就只有true或者flase。
简单来说就  == 的左边和右边比较,你写 (a+1)*8/7 ==b 都可以
(a+1)*8/7视为一个值。就好理解吧!

评分

参与人数 1黑马币 +9 收起 理由
Rancho_Gump + 9 赞一个!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马