分享一道经典的Java计算题,分享的同时也帮助基础薄弱的自己进一步加深理解:
附上代码:
package com.java_foundation.arithmetic;
public class ClassicalCalculation_1 {
public static void main(String[] args) {
int i = 1;
i = i++;
int j = i++;
int k = i+ ++i * i++;
System.out.println("i="+i);
System.out.println("j="+i);
System.out.println("k="+i);
}
}
可以先自己想一下输出的是什么 ?
idea打开ViewàShow ByteCode,查看下字节码指令,通过字节码来分析它的整个运行流程,这里我大致分析了下过程,总结了为下图。
输出:
i=4
j=1
k=11
小结:
1、赋值=是最后计算的
2、=号右边的从左到右加载值依次压入操作数栈
3、实际先算哪个需要根据运算符的优先级来判定
4、自增、自减操作都是直接修改变量的值,不经过操作数栈,这里是误解比较大的地方
5、最后的赋值之前,临时结果也是存储在操作数栈中