java中i++问题的理解

原创 2015年07月06日 17:51:10

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

相关文章推荐

浅谈java之++i和i++区别

浅谈java之++i和i++区别                   今天简单谈谈关于java的一个误区,相信很多刚开始学习java的朋友都会遇到这个问题,虽然问题很简单,但是经常容易搞混,说说jav...

java中的i++ 和 ++i 以及 for循环

今天在看java的i++  和++i 的区别,感觉自己还是会绕。正好整理下。 i++:先赋值,后计算; ++i;先计算,后赋值。 看下面代码:public class Text { public s...

JAVA i=i++的问题

int i=0;      i=i++;      结果i是多少?      这是一个经常被提及的问题,答案一直五花八门。      具体测试一下以说明问题:       代码1:public cla...

java i++和++i的区别

//i++和++i是有区别的, //i++和++i都代表着i=i+1; //i++是在一个先使用原值,然后加1,即先使用i的值,后让i+1. //++i则是先加1后使用,即先让i+1后再使用i的新值....

java中i=i++ 值无变化原因详解

想要弄明白JAVA中i=i++没变化的原因,就要了解JAVA虚拟机的”栈“先进后出的运行机制以下面的代码为例:public class AddOperatorTest{ public static v...

Java的i18n问题解决文档,代码

  • 2012年11月17日 16:32
  • 36KB
  • 下载

“Oracle 9i/Oracle 10g” 查询 参数java.util.date 性能慢的问题和解决方案

假设我们使用这样的sql通过绑定变量(类型为java.util.date)查询数据库,其中end_date是date类型且建立了索引。 “select count(*) from table1 wh...
  • lzzyok
  • lzzyok
  • 2012年09月29日 09:28
  • 1581

java中的i++问题

2009-10-15 17:19 最近老是看到问这样问题的人,来解释下: int i = 0; i = i++; 结果还是0 为什么? 程序的执行顺序是这样的:因为...

Java多线程之i++的安全性问题

问题: 两个线程同时对i=0的数据分别进行i++一百次,结果出来并不是200。理论上来讲,结果最小值为2,最大值为200。 首先解释一下为什么会这样。 i++并非原子操作。执行过程中JVM从内存...

JAVA-SWING入门常见问题集I

1、FRAME怎么实现全屏幕首先要知道屏幕窗口的大小,然后将窗口的位置和大小调整到屏幕窗口的相同大小就ok了。两种方法可实现。   Ⅰ:    程序代码如下:    JFrame frame = ne...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:java中i++问题的理解
举报原因:
原因补充:

(最多只允许输入30个字)