标签:java
java中i++问题的理解
上周二面试中,碰到了一个有疑问的笔试题,在这里来详细分析一下,弄清楚问题缘由,解决迷惑,避免再出现同样的问题。
下面是代码:for循环遍历20次,将count++的值复制给count,问最后count的结果是多少?
public static void main(String[] args) throws Exception {
int count = 0;
for (int i = 0; i < 10; i++) {
count = count++;
// count= ++count;
// count=count++ + ++count;
// count=++count + count++ ;
System.out.println("count==" + count);
}
System.out.println(count);
}
这道题主要就是考察count=count++在java虚拟机中是怎么执行的,它的先后顺序。
在java中,count=count++,先把count的值存放起来,然后执行count++,接着把之前存放的值复制给count(而不是把count+1后的值复制给count),这样我们看到的就是,无论怎么赋值,count的值始终是当初的默认值。如果是在c语言里面呢,我估计答案会不一样的,据某个同学测试了的,是不一样,我没有测试。
当我们把count=count++调整为count=++count,那么内容会是多少呢,结果,会是所谓的1,2,3,4…等。
执行过程为:先count自己加1,然后把自加的结果赋值到count,所以不会保持不变。
接着我们在探讨一下,count=count++换成count=count++ + ++count,那么这样的结果会是多少呢。
在这种情况下,count的执行过程是:先执行最右边的count+1,我们假设count的初始值是0,那么最右边自加1后,结果就变成了,count=1,接着执行count=count+count,这个时候count自身的内容已经有原来的0变成1了,+号前后的count值都是1,这样两部分相加结果就变成了2,第一次的结果也的确是2。
当我们把count=count++换成count=++count + count++呢,这个时候结果如何呢?
结果和上面的这种是一样的,第一次的结果依旧是2,它的执行顺序为:先执行赋=号旁边的++count,也就是让count自己加1,这样count的内容由0变成了1,然后两个1相加,就是所谓的2了。
以上便是我想说的,count=count++;可能有人疑问,为什么count后缀加1没有赋值到count中去,而前缀加1,修改了count的内容后,可以赋值到count中去。实际上,还是前面加粗文字里面说的,内存会暂时存放先前的,在count=count++中,jvm分析后,count后缀加1,会把原来的count值记录下来,存到某个存储空间中去,赋值到count中,count自己也加了1。而前缀加1的优先级最高,一开始就直接修改了count的内容,jvm语法分析,语义分析,把count的内容赋值给count。通过这样的测试,大致可以说明是这样的过程,毕竟最后的测试结果,多组数据的比对,也应证了我的猜想,当然更深入的,还得看看jvm是怎么分析,处理的。
下面有一道题目,和上面类似:
public class MyTest {
static{
int x=5;
}
static int x,y;
public static void main(String[] args) {
x--;
myMethod();
System.out.println(x+ y++ + x);
}
private static void myMethod() {
// TODO Auto-generated method stub
y= x++ + ++x;
}
}
结果是2,原因嘛,大家就自己分析了。
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:java
原文地址:http://blog.csdn.net/xxx823952375/article/details/46777377