Hashub

醉后不知天在水,满船清梦压星河

0%

java自增变量

先看一道面试题

1
2
3
4
5
6
7
8
9
10
public static void main(String[] args) {
int i = 1;
i = i++; //1
int j = i++; //2
int k = i + ++i * i++; //3
System.out.println("i=" + i);
System.out.println("j=" + j);
System.out.println("k=" + k);
}

1
2
3
4
输出结果:
i=4
j=1
k=11

1.

1
i = i++; 
  • 把i的值压入操作数栈

此时操作栈数为1,局部变量表i=1

  • i变量自增1

此时是对局部变量表操作,局部变量表i=2

  • 把操作数栈中的值赋值给i

此时将操作栈数1赋值给局部变量表i,即i=2被覆盖,i=1.

运行完上面一句代码后i=1


2.

1
int j = i++;  

同第一句代码一样执行,在最后赋值时,操作栈数1赋值给局部变量表j,则 j=1.而i在局部变量仍为2

运行完上面一句代码后j=1,i=2


3.

1
int k = i + ++i * i++; 
  • 把i的值压入操作数栈

操作数栈值为2

  • i变量自增1

局部变量表i=3

  • 把i的值压入操作数栈

操作数栈值为3

  • 把i的值压入操作数栈

操作数栈值为3

  • i变量自增1

局部变量表i=4

  • 把操作数栈中前两个弹出求乘积结果再压入栈

操作数栈值为3X3=9

  • 把操作数栈中的值弹出求和再赋值给k

操作数栈值为9+2=11

即最后运行结果为:

1
2
3
i=4
j=1
k=11

总结:

1. 等号右边的从左到右加载值依次压入操作数栈

2. 自增、自减操作都是直接修改变量的值,不经过操作数栈
最后的赋值之前,临时结果也是存储在操作数栈中

参考:CSDN博客、尚硅谷面试题


未完待续

意见和建议欢迎➡右下角联系我