A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 彭旭文 中级黑马   /  2012-9-27 13:42  /  3104 人查看  /  19 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

先看下以下两段小程序:
程序一:
class Test1
{
      int i = 1;
      i++;
      System.out.println(i);
}

打印结果:i=2
程序二:
class Test2
{
    int i=1;
    i=i++;
    System.out.println(i);
}
打印结果:i=1
请问各位朋友,为什么这两个小程序的打印结果不一样,i++和i=i++这两个语句在内存中是如何活动的,请各位指教一下...谢谢!

19 个回复

倒序浏览
i++是把i的值自增一次,而i=i++先把i的值给i自身以后再++,所以i++会自增1,而i=i++不会

点评

同意  发表于 2012-9-27 14:33
回复 使用道具 举报
程序一:
class Test1
{
      int i = 1;
      i++;
      System.out.println(i);

/* 上面的相当于:
              int i=1;
              i++;//这样是先++再输出
              int b=i;
              System.out.println(i);*/
}

打印结果:i=2
程序二:
class Test2
{
    int i=1;
    i=i++;
    System.out.println(i);

/* 上面的相当于:
              int  i=1;
              int  a=i++;//这样是先输出再++;
              System.out.println(a);
*/        
}
打印结果:i=1
回复 使用道具 举报
王贵朝 发表于 2012-9-27 13:46
i++是把i的值自增一次,而i=i++先把i的值给i自身以后再++,所以i++会自增1,而i=i++不会 ...

那么i=i++先把i的值给i自身以后再++,++后的值是2,那么2会立马被存储在内存的哪个变量上?如果是变量i的话,那么就把原来的1值覆盖了,还是变成2,打印结果还是2才对。(我是这样认为的)。希望可以在这个地方得到帮助...谢谢!!!
回复 使用道具 举报
王得新 发表于 2012-9-27 14:07
程序一:
class Test1
{

从打印结果上推算应该是这样的。但是我想从内存的细节变化中去了解这种情况...能说明一下吗?谢谢...
回复 使用道具 举报
这个太普遍了,只要记住i++是先赋值后计算,而++i是先计算后赋值,就可以了
回复 使用道具 举报
刘学 中级黑马 2012-9-27 14:53:31
7#
本帖最后由 刘学 于 2012-9-27 14:55 编辑

程序一:
class Test1
{
      int i = 1;
      i++;      //这句相当于 i=i+1;所以结果为2
      System.out.println(i);
}

打印结果:i=2
程序二:
class Test2
{
    int i=1;
    i=i++;   //i++和++i的区别是i++先运算在自加,而++i是先自加再运算,所以这句相当于吧i又赋值给i(相当于i=i; 然后再自加,可是自加完以后,并没有在赋给i,因为运算已经完成了),然后又输出i,结果为1,我个人这么理解的
    System.out.println(i);
}
打印结果:i=1
回复 使用道具 举报
。。。。。。。。。。。
回复 使用道具 举报
先明白下,java把内存分为:栈内存和堆内存(这里只大概说下,网上资料一大堆)
栈:存放一些基本数据类型的变量和对象的引用变量
堆:对象、数组等,

我回答的有点问题,在这修改下:

程序二:
class Test2
{
    int i=1;
    i=i++;
    System.out.println(i);

/* 上面的相当于:
              int  i=1;
              int  a=i;//这样是先输出再++;
              i++;
              System.out.println(a);
*/        
}
打印结果:i=1



下面看下程序一和程序二的图片讲解:



memory.png (14.39 KB, 下载次数: 58)

图解

图解
回复 使用道具 举报
本帖最后由 宋旭珂 于 2012-9-27 17:47 编辑

程序一:
class Test1
{
       int i = 1;//在栈区分配了一块叫 i 的内存空间,存的内容为1
       i++;//该语句相当于i 自增1,为2,1被清除, i 内容变为2,
       System.out.println(i);
}


打印结果:i=2
程序二:
class Test2
{
     int i=1;//同上
     i=i++;//“++”在后表示先把1这个值赋给 i,此时栈内存中 i 的内容仍为1,以后 i 的内容不变
     System.out.println(i);
}
打印结果:i=1
回复 使用道具 举报
其实记住i++是先使用,在赋值。++i是先赋值再使用就可以了。不用太纠结的
回复 使用道具 举报
陈琦 发表于 2012-9-27 14:51
这个太普遍了,只要记住i++是先赋值后计算,而++i是先计算后赋值,就可以了 ...

呵呵...我只是不知道内存原理而已...想深入了解下...:)
回复 使用道具 举报
刘学 发表于 2012-9-27 14:53
程序一:
class Test1
{

我的纠结就在于这里:i=i之后,应该会立马进行++运算,自增之后会变成2,然后2会存储在内存的哪个区域或者哪个变量上?i=i++语句和System.out.println(i)语句之间,内存到底发生了怎样的变化?
回复 使用道具 举报
寇龙飞 发表于 2012-9-27 15:15
。。。。。。。。。。。

哈哈...;P

点评

呵呵。你懂的。  发表于 2012-9-28 02:29
回复 使用道具 举报
C¤J 发表于 2012-9-27 17:45
其实记住i++是先使用,在赋值。++i是先赋值再使用就可以了。不用太纠结的

呵呵...的确,等以后知识上去了,可能会自然而然解决问题了...
回复 使用道具 举报
宋旭珂 发表于 2012-9-27 17:38
程序一:
class Test1
{

请问一下:要是i的内容不变,++运算部分怎么解释?
回复 使用道具 举报
王得新 发表于 2012-9-27 16:05
先明白下,java把内存分为:栈内存和堆内存(这里只大概说下,网上资料一大堆)
栈:存放一些基本数据类型 ...

谢谢你的详细回答...
回复 使用道具 举报
"i=i++"只是把i以前的内容赋给i,i在栈内存中的内容已经为1,”++“就不再运算,因为等号右边是一部分,左边是一部分,左边的值一确定,整个表达式的运算结果就确定,表达式就结束了,按照我的理解“++”就不会执行。
回复 使用道具 举报
class Test1
{
       int i = 1;
       i++;
       System.out.println(i);
}
//注意程序执行的顺序,cpu是按程序的先后顺序从头到尾执行的,当执行的i++后,i已经加了一次了。当你在来看i时,i已经变为2了。

打印结果:i=2
程序二:
class Test2
{
     int i=1;
     i=i++;
     System.out.println(i);
}
//那么下面的程序和上面的程序有明显的区别,因为i++是一个表达式,而i=i++这个i是表达式的式的值。你可以看一下C语言,什么是表达式。i++这个整体就是表达式,它的值是保留上一次的值不变的。
打印结果:i=1
回复 使用道具 举报
大哥,这种基础,有时间可以看哈c语言语法,i++先将i的值赋给i++将i增加1赋给i所以
程序1会输出2而程序2输出1,还有如果是++i是先将i增加1赋给++i再赋给i,另外i--和--i的原理是一样的,关于++运算符的内存原理就和普通赋值一样,不要吧问题想得太过于复杂。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马