黑马程序员技术交流社区
标题:
JAVA自增运算符++,表达式num=num++的结果
[打印本页]
作者:
ZeroHegel
时间:
2015-7-19 00:03
标题:
JAVA自增运算符++,表达式num=num++的结果
本帖最后由 ZeroHegel 于 2015-7-19 00:17 编辑
在学习JAVA基础时,对于自增运算符++,我们都知道该运算符放在变量的前后的效果是不同。具体为:
如果在数据的后边,数据先操作,再++
如果在数据的前边,数据先++,再操作
如:
int num = 1;
int x = num++;//x为1
int y = ++num;//y为2
复制代码
但当出现下面的情况时,就会很让人费解。
1)++在数据前面,且赋值给自己时:
int num = 1;
num = ++num;
//最后num的值为2
复制代码
2)但++在数据后面,且赋值给自己时:
int num = 1;
num = num++;
//最后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分开来看),运算相当于:
int num =1;
//num++时编译器分配临时变量temp代替原先右边的num
int temp=num;//临时的tmp为1,num为1
num = num;//先赋值
temp = num + 1;//再加1
复制代码
所以导致第二种情况最后num的值为1(没有改变)。
在遇到num++(和num--)时JAVA编译器和C语言的编译器的处理方式是不同的,具体区别可以参考http://www.oschina.net/question/12_8120
以上自己听课时遇到的问题,加上网上的资料和自己的理解整理的,欢迎大牛指正。
作者:
游呤人
时间:
2015-7-19 00:14
可以这样理解(num=num)+1
作者:
tao13yang
时间:
2015-7-19 00:35
++在左边,先自曾1,在赋值,反之先赋值再自曾
作者:
jk7130866
时间:
2015-7-19 08:02
2.种情况没办法理解啊++在右边,先赋值,那num应该等于1,后自加1用该等于2啊
作者:
马北剑西
时间:
2015-7-19 08:52
很详细了
作者:
Matrix_heima
时间:
2015-7-19 09:38
jk7130866 发表于 2015-7-19 08:02
2.种情况没办法理解啊++在右边,先赋值,那num应该等于1,后自加1用该等于2啊 ...
num=num++; 毕老师这样讲的,先将num的值赋给一个临时变量temp(1),自身+1赋值给num(2),最后再将temp的值赋给num(1)。
作者:
joe520kay
时间:
2015-7-19 09:57
不错,借用了temp临时变量来理解,相信很多人刚开始都会很懵,可以借用你这种思想来理解可能更容易点。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2