蔡香满屋
站在牛顿头上吃苹果

有个题如下:

int x =1;

int y = x++; // ++在后字面上看起来是先赋值后自增,其实内存中执行的顺序是先进行计算后赋值

System.out.println(x); // 输出是2

System.out.println(y);  // 输出是1

解析下:x++的意思就是x=x+1; 这一步就是将x变量空间的内容先取出来,然后在常量区再取出1进行运算,运算完之后再次存回x变量空间,x在要做值交换的时候,会先产生一个副本空间也就是拷贝一份(备份)出来,然后原来那份才开始进行计算,注意:++在变量的前面,先自增后备份      ++在变量的后面,先备份后自增。反正赋值都是将备份后的那份空间赋值给其他变量而不是将原来那份赋值给别人。备份那份空间赋值之后就会销毁。

----------------------

相信很多人都会上面那种,但是这个呢?一开始定义一个变量a,将常量1=号也就是赋值给a,那么a初始化值为1,然后a=a++运算之后a的值是多少呢?

int a = 1;
a = a++;
System.out.println(a);
------------------------
为了得到a的值,下面我们画个图了解下栈空间变量之间赋值的中间运算过程

 最后比较经典的三道题就是:

int a = 1;
for (int i = 1; i< 100; i++) {
a = a++; // 因为是后置++,所以是先备份后计算,这个例子是最先的值也就是拷贝出来的那份空间的值不断覆盖原来的那份空间的值的过程
}
System.out.println(a); // 输出结果是1
--------------------
int a = 1;
int b = 2;
for (int i = 1; i< 100; i++) {
b = a++;// 因为是后置++,所以是先备份后计算,最后b的结果是拷贝a出来的那份空间的值也就是a等于99赋值给b

}
System.out.println(a); // 100
System.out.println(b); // 99
------------------
int a = 1;
for (int i = 1; i< 100; i++) {
a = ++a; // 前置++,先计算后备份,也就是说a先加1后变成2才备份一份空间出来里面的值是2,所以最后a的值是100也就是赋值给a就是100
}
System.out.println(a); // 100


posted on 2019-07-20 17:24  蔡香满屋  阅读(337)  评论(0)    收藏  举报