原述
之前知道i++和++i的区别:
- i++先赋值再自增。
- ++i先自增再赋值。
如下:
int i=0;
System.out.println(i++);
System.out.println(i++);
第一个打印出0,第二个打印出1
int i=0;
System.out.println(++i);
System.out.println(++i);
第一个打印出1,第二个打印出2
就是一个先满足别人,一个先满足自己啦
深入
当你遇到这种情况,你会认为i是打印出几?
int i=0;
for(int j=0;j<10;j++){
i=i++;
}
System.out.println(i);
打印出0。
不是说好先赋值再自增吗?那我是不是可以这样理解先赋值给左边的i然后i再自增那岂不是打印出来的还应该是10?难道是编译器的bug?你赞同吗?
其实不是的,它应该是这样的:
1:先赋值 temp=i;
2:再自增 i=i+1;
3:再赋值 i=temp
如果按照我的理解它是这样的:
1:先赋值 i=i;
2:再自增 i=i+1;
但是编译器应该不会这样,大概是i=i没啥意义,编译器不会这样执行。或者基础变量等号赋值都是先创建一个临时变量,然后再把临时变量赋值给等号左边。
所以++i应该是这样的:
1:i=i+1;
2:temp=i;
3:i=temp;
这就是执行内部的算法了,这样确实感觉安全点,但只是感觉说不出为啥(或许是怕多线程环境等号右边的值在赋值时怕修改掉了,创建临时的有利于并发),有知道的小伙伴欢迎评论。