黑马程序员技术交流社区

标题: 关于i++的理解 [打印本页]

作者: 张金    时间: 2012-9-20 22:35
标题: 关于i++的理解
本帖最后由 张金 于 2012-9-21 22:06 编辑

public class Test {
        public static void main(String[] args) {
                int i = 10;
                int j = 20;
                i = i++;
                System.out.println(i);
        }
}
   原本在第5行,我是想写j = i++;来着,但是错写成i=i++;也正是由于这个语句,得出了令人意想不到的结果。因为如果写成 j=i++;
   那么会输出j=11;
   而写成i = i++;则输出得到i=10;
   而如果同样的代码换成C/C++执行,则无论是i=i++还是j = i++;
   得到的结果是相同的,都是11,这是为什么呢?
作者: 王雷    时间: 2012-9-20 23:08
第一步 内存中有一个i = 10,然后用一个开辟一块临时空间将10存起来, 第二步 i++,i变成11,第三步,再将临时存的10赋值给i。所以i还是10
作者: 皮卫凯    时间: 2012-9-20 23:18
                int i = 10;
                int j = 20;
                i = i++;
                System.out.println(i);
i = i++;
i++意思是先赋值在自增。i=i++的话 i 先把值赋给等号左边的 i,再自增。你打印 i ,虽然 i 自增了,但是自增的值没有赋值,所以i 的值还是为 10.

j=i++;
i 把值赋给 j,然后再自增。但打印的是i 。这是的 i 已经自增了。所以打印的值是11


C或者C++的话,也是一样的。不可能不一样的。
作者: 李健_8    时间: 2012-9-20 23:26
只要理解一个道理就好了   先赋值  后运算

作者: 黄基焜    时间: 2012-9-20 23:43
j=i++和i=i++是的赋值流程是一样的。所以后面跟的打印出来都是10,不信可以自己试下,绝对不是11.
class demo9
{
        public static void main(String[] args)
        {
                int i = 10;
                int j = 20;
                i = i++;//这里可以这样想i++就是i=i+1的过程,但是i=i++是先赋值再自增所以就相当于i=i再i+1的过程因为自己赋值了给自己,所以不会重复赋值的操作
                System.out.println("i=="+i);//这里的i是10
                j = i++;
                System.out.println("j=="+j);//这里的j也是10
                System.out.println("i=="+i);//这里的i才就是11

        }
}

作者: 张忠豹    时间: 2012-9-21 00:12
精辟的来了,先求给分啊。

用堆栈来解释是最恰不过的了。
首先,JVm 会在内存中开辟出一个栈出来,由于这里没有太明确的牵扯到对象的概念,暂不谈堆的问题。
当运行到i=i++之前,在堆中存储的i=10,然后在堆中又开辟了一个临时空间来运行i++.
在这里你可以将i++理解为一个方法,并标记第一个i 为i1,第二个为i2,也就是在这个方法内先将i2赋值给了i1,然后再i2+1,但加完以后并没有赋给i1变量进行存储,另外这里的i1,i2与i为同一地址,也就是说i1,i2变了i也会变.然后方法出栈,整个过程中i始终没变 ,仍为10;





作者: 张金    时间: 2012-9-21 22:05
王雷 发表于 2012-9-20 23:08
第一步 内存中有一个i = 10,然后用一个开辟一块临时空间将10存起来, 第二步 i++,i变成11,第三步,再将 ...

应该是这样理解的
作者: 刘伟平    时间: 2012-9-22 20:46
张忠豹 发表于 2012-9-21 00:12
精辟的来了,先求给分啊。

用堆栈来解释是最恰不过的了。

这种说法很有道理!!
作者: 彭旭文    时间: 2012-9-22 21:21
张忠豹 发表于 2012-9-21 00:12
精辟的来了,先求给分啊。

用堆栈来解释是最恰不过的了。

请问一下:int i=10不是在栈内存中建立空间的吗?这个语句和堆内存有什么关系?请教一下...:)




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