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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张金 中级黑马   /  2012-9-20 22:35  /  4349 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 张金 于 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,这是为什么呢?

评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1 赞一个!

查看全部评分

9 个回复

正序浏览
张忠豹 发表于 2012-9-21 00:12
精辟的来了,先求给分啊。

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

请问一下:int i=10不是在栈内存中建立空间的吗?这个语句和堆内存有什么关系?请教一下...:)
回复 使用道具 举报
张忠豹 发表于 2012-9-21 00:12
精辟的来了,先求给分啊。

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

这种说法很有道理!!
回复 使用道具 举报
张金 中级黑马 2012-9-21 22:05:37
7#
王雷 发表于 2012-9-20 23:08
第一步 内存中有一个i = 10,然后用一个开辟一块临时空间将10存起来, 第二步 i++,i变成11,第三步,再将 ...

应该是这样理解的
回复 使用道具 举报
精辟的来了,先求给分啊。

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




回复 使用道具 举报
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

        }
}
回复 使用道具 举报
只要理解一个道理就好了   先赋值  后运算
回复 使用道具 举报
                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++的话,也是一样的。不可能不一样的。

点评

错了吧  发表于 2012-9-22 20:33
回复 使用道具 举报
第一步 内存中有一个i = 10,然后用一个开辟一块临时空间将10存起来, 第二步 i++,i变成11,第三步,再将临时存的10赋值给i。所以i还是10
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马