本帖最后由 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
以上自己听课时遇到的问题,加上网上的资料和自己的理解整理的,欢迎大牛指正。
|
|