黑马程序员技术交流社区

标题: 基础知识中的纠结... [打印本页]

作者: 彭旭文    时间: 2012-9-27 13:42
标题: 基础知识中的纠结...
先看下以下两段小程序:
程序一:
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++这两个语句在内存中是如何活动的,请各位指教一下...谢谢!
作者: 王贵朝    时间: 2012-9-27 13:46
i++是把i的值自增一次,而i=i++先把i的值给i自身以后再++,所以i++会自增1,而i=i++不会
作者: 王得新    时间: 2012-9-27 14:07
程序一:
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 14:32
王贵朝 发表于 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:36
王得新 发表于 2012-9-27 14:07
程序一:
class Test1
{

从打印结果上推算应该是这样的。但是我想从内存的细节变化中去了解这种情况...能说明一下吗?谢谢...
作者: 陈琦    时间: 2012-9-27 14:51
这个太普遍了,只要记住i++是先赋值后计算,而++i是先计算后赋值,就可以了
作者: 刘学    时间: 2012-9-27 14:53
本帖最后由 刘学 于 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

作者: 寇龙飞    时间: 2012-9-27 15:15
。。。。。。。。。。。
作者: 王得新    时间: 2012-9-27 16:05
先明白下,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, 下载次数: 45)

图解

图解

作者: 宋旭珂    时间: 2012-9-27 17:38
本帖最后由 宋旭珂 于 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
作者: 陈郊    时间: 2012-9-27 17:45
其实记住i++是先使用,在赋值。++i是先赋值再使用就可以了。不用太纠结的
作者: 彭旭文    时间: 2012-9-28 01:32
陈琦 发表于 2012-9-27 14:51
这个太普遍了,只要记住i++是先赋值后计算,而++i是先计算后赋值,就可以了 ...

呵呵...我只是不知道内存原理而已...想深入了解下...:)
作者: 彭旭文    时间: 2012-9-28 01:43
刘学 发表于 2012-9-27 14:53
程序一:
class Test1
{

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

哈哈...;P
作者: 彭旭文    时间: 2012-9-28 01:47
C¤J 发表于 2012-9-27 17:45
其实记住i++是先使用,在赋值。++i是先赋值再使用就可以了。不用太纠结的

呵呵...的确,等以后知识上去了,可能会自然而然解决问题了...
作者: 彭旭文    时间: 2012-9-28 01:55
宋旭珂 发表于 2012-9-27 17:38
程序一:
class Test1
{

请问一下:要是i的内容不变,++运算部分怎么解释?
作者: 彭旭文    时间: 2012-9-28 02:03
王得新 发表于 2012-9-27 16:05
先明白下,java把内存分为:栈内存和堆内存(这里只大概说下,网上资料一大堆)
栈:存放一些基本数据类型 ...

谢谢你的详细回答...
作者: 宋旭珂    时间: 2012-9-28 15:34
"i=i++"只是把i以前的内容赋给i,i在栈内存中的内容已经为1,”++“就不再运算,因为等号右边是一部分,左边是一部分,左边的值一确定,整个表达式的运算结果就确定,表达式就结束了,按照我的理解“++”就不会执行。
作者: 胡斌    时间: 2012-9-28 17:26
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
作者: 柳彬    时间: 2012-9-28 18:28
大哥,这种基础,有时间可以看哈c语言语法,i++先将i的值赋给i++将i增加1赋给i所以
程序1会输出2而程序2输出1,还有如果是++i是先将i增加1赋给++i再赋给i,另外i--和--i的原理是一样的,关于++运算符的内存原理就和普通赋值一样,不要吧问题想得太过于复杂。





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2