一个看着简单,但很难说清楚的问题
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