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

ZeroHegel

中级黑马

  • 黑马币:

  • 帖子:

  • 精华:

本帖最后由 ZeroHegel 于 2015-7-19 00:17 编辑

在学习JAVA基础时,对于自增运算符++,我们都知道该运算符放在变量的前后的效果是不同。具体为:
如果在数据的后边,数据先操作,再++
如果在数据的前边,数据先++,再操作
如:
  1. int num = 1;
  2. int x = num++;//x为1
  3. int y = ++num;//y为2
复制代码
但当出现下面的情况时,就会很让人费解。

1)++在数据前面,且赋值给自己时:
  1. int num = 1;
  2. num = ++num;
  3. //最后num的值为2
复制代码

2)但++在数据后面,且赋值给自己时:
  1. int num = 1;
  2. num = num++;
  3. //最后num的值为1
复制代码
[size=13.7931032180786px]第一种情况我们很好理解,++num先运行再赋值,这样num的最后的值就为2,测试的结果也确实如此。
[size=13.7931032180786px]但是第二种情况时照原来的思路,先赋值num的值为1,再num++,那么num的值应该是2才对,可是测试的结果却为1。
[size=13.7931032180786px]实际的结果似乎颠覆了我们原来的思路(简直是毁三观啊),其实不然。
因java的编译器在遇到 num++(和num- -)的时候会重新为变量运算分配一块内存空间, 以存放原始的值,而在完成了赋值运算之后,将这块内存释放掉。(个人理解++num或--num不会重新为变量分配一块内存空间)
简单来讲num = num++(左边的num和右边的num分开来看),运算相当于:
  1. int num =1;
  2. //num++时编译器分配临时变量temp代替原先右边的num
  3. int temp=num;//临时的tmp为1,num为1
  4. num = num;//先赋值
  5. temp = num + 1;//再加1
复制代码
所以导致第二种情况最后num的值为1(没有改变)。

在遇到num++(和num--)时JAVA编译器和C语言的编译器的处理方式是不同的,具体区别可以参考http://www.oschina.net/question/12_8120
以上自己听课时遇到的问题,加上网上的资料和自己的理解整理的,欢迎大牛指正。





6 个回复

倒序浏览
可以这样理解(num=num)+1
回复 使用道具 举报
++在左边,先自曾1,在赋值,反之先赋值再自曾
回复 使用道具 举报
2.种情况没办法理解啊++在右边,先赋值,那num应该等于1,后自加1用该等于2啊
回复 使用道具 举报
很详细了
回复 使用道具 举报
jk7130866 发表于 2015-7-19 08:02
2.种情况没办法理解啊++在右边,先赋值,那num应该等于1,后自加1用该等于2啊 ...

num=num++;  毕老师这样讲的,先将num的值赋给一个临时变量temp(1),自身+1赋值给num(2),最后再将temp的值赋给num(1)。
回复 使用道具 举报
不错,借用了temp临时变量来理解,相信很多人刚开始都会很懵,可以借用你这种思想来理解可能更容易点。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马