0
点赞
收藏
分享

微信扫一扫

关于自增变量注意的问题

上善若水的道 2022-04-13 阅读 69
java

代码如下

public static void main(String[] ars) {
		int i = 1;
		i = i++;
		int j = i++;
		int k = i + ++i * i++;
		System.out.println("i=" + i);
		System.out.println("j=" + j);
		System.out.println("k=" + k);
	}

输出结果:

i=4
j=1
k=11

初学者可能会比较疑惑,为什么是这个值,下面来分析一下。

首先要知道赋值操作时要用到操作数栈的,而自增、自减操作不经过操作数栈,是直接修改局部变量表里的值。

(一)所以在i = i++;

1、将i的值放到操作数栈,此时是1;

2、i自增是直接修改局部变量表的值变成2,

3、操作数栈中i的值赋给i。

所以i的值还是1。

(二)执行这条语句int j = i++;也是一样的,把操作数栈中i的值赋给j,j就是1,此时i在局部变量表中是2;

(三)int k = i + ++i * i++;执行这句后i在局部变量表中是4,所以输出就是4了。

k的值在上述已经知道是从操作数栈中赋值的,所以来研究一下操作数栈中的数值。

1、把i的值压入操作数栈中,此时是2。

2、i自增+1。

3、把i的值压入操作数栈中,此时是3、2(3在栈顶)。

4、把i的值压入操作数栈中,此时是3、3、2(3在栈顶)。

5、i自增+1。

6、把操作数栈中前两个数弹出,求乘积后压入栈。

7、把操作数栈中的值弹出求和,再赋值给k。

所以最后打印出来k的值是11。

总结:

1、赋值= 是最后计算

2、= 右边的从左到右加载值依次压入操作数栈

3、实际先算哪个是看运算符的优先级

4、自增自减都是直接改变变量的值,不经过操作数栈

5、最后赋值之前,临时结果也是存储再操作数栈中

举报

相关推荐

0 条评论