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

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-08 21:59:16

java中i++问题的理解的相关文章

Java中线程同步的理解 - 其实应该叫做Java线程排队

Java中线程同步的理解 我们可以在计算机上运行各种计算机软件程序.每一个运行的程序可能包括多个独立运行的线程(Thread). 线程(Thread)是一份独立运行的程序,有自己专用的运行栈.线程有可能和其他线程共享一些资源,比如,内存,文件,数据库等. 当多个线程同时读写同一份共享资源的时候,可能会引起冲突.这时候,我们需要引入线程"同步"机制,即各位线程之间要有个先来后到,不能一窝蜂挤上去抢作一团. 同步这个词是从英文synchronize(使同时发生)翻译过来的.我也不明白为什么

java中对于多态的理解

面向对象: 类:具体的对象抽象而来,可以抽象的表示一类具有相同特征和行为的对象 对象:是由类的实例化而来,对象是类的一个实例 java中关于多态的理解 打个比方 父亲person有行为这个方法,里面包括几个动作:吃饭,睡觉,走路 父亲有三个儿子,三个儿子都继承了父亲的行为方法,所以三个儿子都有吃饭,睡觉,走路这些动作,但是三个儿子又分别有自己的动作--大儿子A会弹吉他,二儿子B会唱歌,三儿子C会打鼓 ... 1.Person person = new A(); 不是父类对象指向子类引用而是父类引

java中的接口深层理解

深入理解Java的接口和抽象类 对于面向对象编程来说,抽象是它的一大特征之一.在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类.这两者有太多相似的地方,又有太多不同的地方.很多人在初学的时候会以为它们可以随意互换使用,但是实际则不然.今天我们就一起来学习一下Java中的接口和抽象类.下面是本文的目录大纲: 一.抽象类 二.接口 三.抽象类和接口的区别 若有不正之处,请多多谅解并欢迎批评指正,不甚感激. 请尊重作者劳动成果,转载请标明原文链接: http://www.cnblogs.

java中static关键字的理解(转载)

static关键字是很多朋友在编写代码和阅读代码时碰到的比较难以理解的一个关键字,也是各大公司的面试官喜欢在面试时问到的知识点之一.下面就先讲述一下static关键字的用法和平常容易误解的地方,最后列举了一些面试笔试中常见的关于static的考题.以下是本文的目录大纲: 一.static关键字的用途 二.static关键字的误区 三.常见的笔试面试题 若有不正之处,希望谅解并欢迎批评指正. 请尊重作者劳动成果,转载请标明原文链接: http://www.cnblogs.com/dolphin05

Java中对Clone的理解

面试中经常遇到Clone的相关知识,今天总算是把Clone理解的比较透彻了!Java中Clone的概念大家应该都很熟悉了,它可以让我们很方便的“制造”出一个对象的副本来,下面来具体看看java中的Clone机制是如何工作的?     1. Clone和Copy     假设现在有一个User对象,User u1=new User(“U1001”,“Jason”,25),通常我们会有这样的赋值User u2=u1,这个时候只是简单了copy了一下reference,u2和u1都指向内存中同一个ob

对Java中字符串的进一步理解

字符串在程序开发中无处不在,也是用户交互所涉及到最频繁的数据类型,那么字符串不仅仅就是我们简单的理解的String str = "abc";一起来更加深入的看一下 在Java中,字符串被作为String类型的对象处理,和基本数据类型不同,字符串可以直接使用各种字符串对象的方法,而基本数据类型不行,String类位于java.lang包中,默认情况下该包会被自动的导入所有的应用程序 String对象创建后不能被更改,是不可变的,我们重新赋值并不是修改了对象所引用的内存空间的数据,而是创建

【知了堂学习笔记】java中常用集合的理解

最近学习了java中常用集合类的一些知识,在这里作为一只小白,我来谈谈我的理解,顺带总结知识点. 引入:在没有接触之前,听到集合,给我感觉是想到了数学中的集合一样,里面存放着一个一个的元素.其实不然,这个集合也就差不多,是用来存放元素的容器. Java中的集合类包含的内容很多而且很重要,很多数据的存储和处理(排序,去重,筛选等)都需要通过集合类来完成. 今天我要谈的主要是,如下图所示: 1.Collection Collection是最基本的集合类型,若要检查Collection中的元素,可以使

java中构造方法的简单理解(转)

构造方法就是与类同名的那个方法,它的作用是可以用来初始化class Person //人类{public Person(String n,int a) //构造方法 { name = n; age = a;} private string name; private int age;}static void main(String[] args){Person p = new Person("张三",14);//这就是作用}new一个对象的时候要用到构造函数,例如Hello hello

java中二进制反码补码的理解

7句真言 1,二进制最高位是符号位 0正数 1负数 2,正数的原码,反码,补码都一样 3负数的原码反码 补码 (符号位不变,其他的位数取反 0->1 1->0) 4 0的反码补码都是0 5java中没有无符号数,换句话说,java中的数都是有符号的 6计算机运算的时候,都是以补码的方式来运算的 7,负数的补码 = 他的反码+1

Java中instanceof关键字的理解

java 中的instanceof 运算符是用来在运行时指出对象是否是特定类的一个实例.instanceof通过返回一个布尔值来指出,这个对象是否是这个特定类或者是它的子类的一个实例. 用法: result = object instanceof class 参数: Result:布尔类型. Object:必选项.任意对象表达式. Class:必选项.任意已定义的对象类. 说明: 如果 object 是 class 的一个实例,则 instanceof 运算符返回 true.如果 object