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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李勇 初级黑马   /  2012-6-14 09:57  /  2128 人查看  /  12 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文


public class day1001 {
        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);//x=2,y=0
                                else
                                        System.out.println("y="+y+",x="+x);
                                               
        }
}

结果是 x=2 y=0
我想不通为什么y是0 减过两次了 为什么还会是0

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 新人奖励

查看全部评分

12 个回复

倒序浏览
if((++x==y--)&(x++==1||--y==0))
++x 此时x为1.而y--是先计算,再自减1.所以此时y还是1,跟x相等,第一个表达式成立,之后y变为了0.
x++是先比较,此时x=1,和1相等,所以条件成立,然后x再自加1,x的结果就为2.
而||符号是只要前面那个条件满足,后面就不需要计算,所以--y==0这个表达式不计算,所以y还是0!

评分

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

查看全部评分

回复 使用道具 举报
if((++x==y--)&(x++==1||--y==0))这条语句,后面一部分x++==1||--y==0,前面的x++的结果是为1,所以为true,后面的--y==0应该就不会判断了吧,我是这样理解的
回复 使用道具 举报
if((++x==y--)&(x++==1||--y==0))这条语句,后面一部分x++==1||--y==0,前面的x++的结果是为1,所以为true,后面的--y==0应该就不会判断了吧,我是这样理解的
回复 使用道具 举报
如果你改为if((++x==y--)&(x++==1|--y==0))这样,那么y的最后结果就是y=-1了!
回复 使用道具 举报
分解一下++x==y--为真 x=1,y=0
x++==1 为真 x=2
|| 短路运算 如果前面为真后面的可以不进行计算 所以y仍然等于0
回复 使用道具 举报
public class day1001 {
        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);//x=2,y=0
                                else
                                        System.out.println("y="+y+",x="+x);
                                                
        }
}
在if((++x==y--)&(x++==1||--y==0))语句中 使用到了一些逻辑运算符 在逻辑运算符中&& ||与&  |  使用是有区别的  &  | 使用时两端的表达式都要进行判断执行 然而&&  || 使用的时候 只要在左端能判断出来结果 有段就不再执行了 这就是  x=2,y=0的原因
回复 使用道具 举报
张_涛 黑马帝 2012-6-14 10:14:38
8#
“&&”、“||”为短路运算符,意思为:
1.“&&”运算符检查第一个表达式是否返回“false”,如果是“false”则结果必为“false”,不再检查其他内容。
2.“||”运算符检查第一个表达式是否返回“true”,如果是“true”则结果必为“true”,不再检查其他内容。
因此,回到你的程序进行观察:
    当++x==y--做完之后,x为1,y为0,表达式结果为真;
    当遇到x++==1 || --y==0,首先可以看到x++==1为先与1进行比较再加1,因此为真。当x++==1为真而运算符为||时,那么--y==0就不需要判断,所以y就没有再自减了。执行完之后,x为2,y依然为0,表达式结果为真;
    此后,你用&位运算符,应该手误吧,当然,位运算最后值非0,那么if条件就为真,执行第一个输出语句x=2,y=0。
   

评分

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

查看全部评分

回复 使用道具 举报
这是考查逻辑运算符|,&和||,&&的区别了。
运算符|和&在进行运算时,不管前面的是真是假,后面的都会进行运算。

而运算符||和&&在进行运算时,其中
||:只要前面一项为真,那么后面的表达式就不用运算了。
&&:只要前面的一项表达式为假,的面的也不用运算了。

int x=0,y=1;
  if((++x==y--)&(x++==1||--y==0))
楼主这道题,++x先加1变为1,y也等于1,所以相等,即第一个一达式为真,因为是&运算,所以还得继续,而后y再减1变成0,这个表达式x++==1,是x先参与运算,所以x==1为真,因为是||运算,所以后面的不用再运算了,但x要自减1,最后x=2,y=0;

评分

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

查看全部评分

回复 使用道具 举报
if((++x==y--)&(x++==1||--y==0))
&&运算必须两个都为真,结果才为真,++x是x先自增,所以x此时为1,y--是y先和++x比较,为真后,再自减为0
||运算是只要一个为真,结果就为真,后面的运算就不再进行,因为x++==1,是x先和1比较,为真后x自增为2,||运算就直接返回真,后面不在执行
所以此时的x=2,y=0
回复 使用道具 举报
这个 应该去了解i++ ++i的关系吧!一个是判断后+1 一个是判断前+1
回复 使用道具 举报
问题在于这句 if((++x==y--)&(x++==1||--y==0))

前半句(++x==y--),里面==左右两边的式子++x和y--都计算了;
后半句(x++==1||--y==0)
,里面只计算了++x==1,因为楼主用的是"||",不是"|",前者左边为真则停止计算直接返回真。


所以最后x自增2次,y自减1次。
回复 使用道具 举报
查逻辑运算符|,&和||,&&的区别
“&&”、“||”为短路运算符,意思为:
“&&”运算符检查第一个表达式是否返回“false”,如果是“false”则结果必为“false”,右边表达式不参与运算
“||”运算符检查第一个表达式是否返回“true”,如果是“true”则结果必为“true”,右边表达式不参与运算
因此
    ++x先加1变为1,y也等于1,所以相等,即第一个一达式为真,因为是&运算,所以还得继续,而后y再减1变成0,这个表达式x++==1,是x先参与运算,所以x==1为真,因为是||运算,所以后面的不用再运算了,但x要自减1,最后x=2,y=0
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马