3.8,彻底搞定++运算符
很多博客都在讲自增运算符,但是我当初始终感觉讲的不太清晰,于是乎便有了这一片文章,但是由于++操作涉及的知识点比较深,是由字节码搞的鬼,所以使用图和文字的形式去书写,希望对大家有所启发。
举例一
public void method7(){
int i = 10;
int a = i++;
int j = 20;
int b = ++j;
}
字节码如下
0 bipush 10
2 istore_1
3 iload_1
4 iinc 1 by 1
7 istore_2
8 bipush 20
10 istore_3
11 iinc 3 by 1
14 iload_3
15 istore 4
17 return
-
bipush 10
-
istore_1
-
iload_1
-
iinc 1 by 1
-
istore_2
-
bipush 20(同上)
-
istore_3
-
iinc 3 by 1
-
iload_3
-
istore 4
-
return
上面的流程就是自增的字节码规定的流程图,总结一句话就是:
i++是先取出放入操作数栈后他才改变,i–是先改变然后才放入操作数栈进行复制。
同理有一道面试题目:
public void method8(){
int i = 10;
i = i++;
System.out.println(i);//10
}
0 bipush 10
2 istore_1
3 iload_1
4 iinc 1 by 1
7 istore_1
8 getstatic #2 <java/lang/System.out>
11 iload_1
12 invokevirtual #5 <java/io/PrintStream.println>
15 return
-
先往操作数栈中放入10
-
然后将其放入局部变量表想下标为1的地方
-
然后将下标为1的局部变量表的值填写入操作数栈中
-
改变局部变量表下标为1的数字,为11
-
然后将操作数栈中的数字出栈,并放入局部变量表中,即覆盖了原来的11,变为了10
这也就是之前有人常说的有一个局部变量的值覆盖了原有的值,这个局部变量的值就是操作数栈中先存入的值。
这也就是之前有人常说的有一个局部变量的值覆盖了原有的值,这个局部变量的值就是操作数栈中先存入的值。