java中i++问题的理解

来源:互联网 发布:国内旅游市场数据 编辑:程序博客网 时间:2024/04/30 08:08

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语言里面呢,我估计答案会不一样的,据某个同学测试了的,是不一样,我没有测试。

update:in(2015-07-06 21:04:55)进一步来理解,参考了面试宝典上的内容,count=count++这种,属于java用了中间变量缓存机制,我们用一个复杂的例子来理解吧,count=++count + count++ + count++ + count++,这种情况下,我们的执行代码如下:count=1,count=count+ count++ +count++ + count++;具体写为:x=(count+count++),y=(x+count++),z=(y+count++);count=z;就是这样的步骤,我们说一下x=(count+count++),count=1了,x=count+count=2,count自己加1就等于了2;y=(x+count++),y=x+count=2+2=4,count自己加1等于3,z=(y+count++),z=y+count=4+3=7,count自己加1等于4

引申内容

当我们把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,原因嘛,大家就自己分析了。

1 0