日期:2014-05-20  浏览次数:20636 次

一个看着简单,但很难说清楚的问题

public   class   test
{
public   static   void   main(String[]   args)
{
      int   d=2;
      d=++d;
      System.out.println(d);
      System.out.println(d);
     
}
}
输出3


public   class   test
{
public   static   void   main(String[]   args)
{
      int   d=2;
      d=d++;
      System.out.println(d);
      System.out.println(d);
     
}
}
输出的是2   ,为什么不输出3   就因为先进行赋值运算,那d进行++操作得到的东西那里去了,希望会的能帮忙解答以下


------解决方案--------------------
对,现在才发现第二个代码d=d++的确不太明白呀!!!
------解决方案--------------------
看看这里
http://community.csdn.net/Expert/topic/5738/5738096.xml?temp=.3480188
二楼我回的那个
不重复写了...

------解决方案--------------------
d=d++
第一步:计算表达式 "d++ "的值是2
第二步:将表达式的值赋给d

一般是这样认识的 也许我们都认为d++的“++”是最后执行的
其实d++的“++”在计算完表达式就“=”之前先执行了!

“d++”:得到2
++:得到d=3
d=表达式:得到d=2
------解决方案--------------------
++d 将d加一,把值付给d 所以的等于3
d++ 此时的d的值还没有变 所以d=2
------解决方案--------------------
d=d++;

第一步:执行“d++”运算得d=3
第二歩:“d++”的值是2,d的值为3
第三步: 把“d++”(d的值为3,但d++的值为2)的值赋给d,得d为2(d由3变为2)

得出结论最终结果:d为2.
------解决方案--------------------
回复人:Davis129(别信自己) ( 二级(初级)) 信誉:100 2007-9-11 21:25:55 得分:0

楼上的连接好象进不去

“载入样式表单出错: 分析 XSLT 样式表单失败。”??
______________________________________________________

哈哈,CSDN 针对 Firefox 的超级大 Bug。

http://community.csdn.net/Expert/topic/5738/5738096.xml?temp=.3480188

改成:

http://community.csdn.net/Expert/TopicView3.asp?id=5738096

就可以了。
------解决方案--------------------
建议楼主你可以去看看编译以后的字节码
计算机是这样处理的

i++的情况
iconst_0
istore_1
iload_1
iinc 1,1
istore_1

++i的情况
iconst_0
istore_1
iinc 1,1
iload_1
istore_1


在这里jvm里面有两个存储区,一个是暂存区(是一个堆栈,以下称为堆栈),另一个是变量区。
语句istore_1是将堆栈中的值弹出存入相应的变量区(赋值);语句iload_1是将变量区中的值暂存如堆栈中。
因为i = i++;是先将i的值(0)存入堆栈,然后对变量区中的i自加1,这时i的值的确是1,但是随后的istore_1又将堆栈的值(0)弹出赋给变量区的i,所以最后i = 0。
又因为i = ++i;是先对变量区中的i自加1,然后再将变量区中i的值(1)存入堆栈,虽然最后执行了istore_1,但也只是将堆栈中的值(1)弹出赋给变量区的i,所以i = ++i;的结果是i = 1