黑马程序员技术交流社区
标题:
这个程序为什么是这个结果?
[打印本页]
作者:
李海鹏
时间:
2013-1-15 20:04
标题:
这个程序为什么是这个结果?
本帖最后由 张向辉 于 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里面不是只是条件吗?难道还运算吗?
作者:
jonn
时间:
2013-1-15 20:13
当然会运算啊,变量 x,y 随时在栈区里改变呢
在条件表示里返回值只有false和ture两种,LZ这里自增(自减)和逻辑表达式组合,条件里在两个变量 x,y 在判断的时候,一直在修改
栈区分配的x,y的值,你声明的变量不是static的,是冬天,随时都修改它的初始值
作者:
jonn
时间:
2013-1-15 20:15
QQ截图20130115201411.png
(4.37 KB, 下载次数: 36)
下载附件
2013-1-15 20:14 上传
{:soso_e127:}上面的字打错了,改成是动态了滴
作者:
胡勇敏
时间:
2013-1-15 20:17
if括号中有++x(先自增再运算),y--(先运算再自减),x++(先运算再自增),--y(先自减再运算)的运算,所以判断if是否成立看的是这些运算完成后产生的值是真还是假了。
作者:
周志强
时间:
2013-1-15 20:19
if里面需要判断出结果,是真还是假?是真就会执行
System.out.println("x="+x+",y="+y);
是假 就会执行
System.out.println("y="+y+",x="+x);
但是逻辑运算在运算的时候,会把局部变量x,y的值在堆内存中改变,所以会打印出不同的结果
运行结果是x=2,y=0
作者:
涂春保
时间:
2013-1-15 20:21
{:soso_e101:}这个是要进行运算的,因为IF循环里面的运算顺序在进行啊
作者:
黑马刘杰
时间:
2013-1-15 20:30
本帖最后由 黑马刘杰 于 2013-1-15 20:31 编辑
if里面的判别式是有运算的
public class Demo {
public static void main(String[] args) {
int x = 0, y = 1;
//首先,==优先级大于&,&没有短路作用,++x是先运算后引用,x++是先引用后运算
//++x==y--,可以这样理解,分为两步(++x)==y;y--;这里得出TRUE,x值变为1,y的值变为0
//x++==1,即x==1;x++;得出TRUE,x值变为2
//||具有短路特点,后面的就不执行了,判别式即为TRUE
if (++x == y-- & x++ == 1 || --y == 0)
System.out.println("x=" + x + ",y=" + y);
else
System.out.println("y=" + y + ",x=" + x);
}
}
复制代码
作者:
刘志雄
时间:
2013-1-15 20:49
我们先来搞清楚这里面涉及到的几个运算符的优先级
++、--同优先级 > == > & >||
知道优先级后,其加上括号的等式就变为(((++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
作者:
丁强强
时间:
2013-1-15 21:38
你问的问题,郁闷了。
if(条件表达式)
里面可以进行运算,最后只能为true或者flase。
最后要是比较运算符
例如 if (a =b)这是赋值运算
if (a+1==b) 这个最后是==(比较运算符)
结果就只有true或者flase。
简单来说就 == 的左边和右边比较,你写 (a+1)*8/7 ==b 都可以
(a+1)*8/7视为一个值。就好理解吧!
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2