之前我们常说的i++是先自增后操作,++i则是先操作后自增,运行一下代码:
int i=1; System.out.println("初始i值:"+i); i=i++; System.out.println("i++后i值:"+i); i=++i; System.out.println("++i后i值:"+i);
想着应该是1,2,3,但结果却为:
初始i值:1 i++后i值:1 ++i后i值:2
其实在执行i=i++的过程中,是先找了一个临时变量temp存储i,而后将i+1赋给i,再将temp赋给i,即:
int i=1; int temp = i; i = i+1; i = temp;
为了区分两个i,也可以写成下面的形式:
int i=1; int j=i++; //等价于
int i=1;
int temp = i;
i = i+1;
j = temp;
而在执行i=++i时,是将i(1)原地赋值给i后,进行了自增的操作,即
i=i; i=i=1;
这主要与JVM有关,在遇到i++和i--的时候会重新为变量运算分配一块内存空间,以存放原始的值,而在完成了赋值运算之后,将这块内存释放掉,反汇编代码:
stack=1, locals=2, args_size=1
//int i=1; 0: iconst_1 //常量值1 1: istore_1 //将常量1存入变量i中,入栈
//i=i++ 2: iload_1 //开辟一块内存空间加载i值,temp=i=1 3: iinc 1, 1 //i自增为2 6: istore_1 //将temp的值存入变量i中,i仍为1
//i=++i; 7: iinc 1, 1 //将i自增为2 10: iload_1 //将自增后的i入栈 11: istore_1 //加载栈顶的i并重新赋给i,此时i为2 12: return LineNumberTable: line 3: 0 line 5: 2 line 7: 7 line 10: 12
上面的汇编代码,我理解的不算太好,应该是有点问题的,不过程序代码可参考上面写的去理解
小tips:
查看汇编代码,命令行cmd
javac Main.java javap -c -v Main.class