题目:
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=" + j);
System.out.println("k=" + k);
}
i = ?
j = ?
k = ?
答案
->
->
->
->
->
->
->
->
->
->’
答案:
i=4
j=1
k=11
代码分析:
左边的为局部变量表的内容,右边的运算是在栈中进行计算的,栈内存的计算结果最终会赋值到局部变量表。
++在前时会先进行自增,++在后时先操作,后自增。
public static void main(String[] args) {
int i = 1; //i为1
i = i++; //++在后面,此时会先赋值,然后再进行自增。因此i = 1
int j = i++; //同理,i先赋值给j,j=1,赋值完的i自增,i=2
int k = i + ++i * i++;
/**
* 首先计算时会先压入栈内存中,因此第一个i为2,第二个为3,第三个i为3
* 在栈内存中: ++i * i++ = 3*3 = 9
* 最后 i + ( ++i * i++) = 2 + 9 = 11;
* 因此k = 11;
*/
System.out.println("i=" + i);
System.out.println("j=" + j);
System.out.println("k=" + k);
}
总结:
- 赋值=,最后计算
- =右边的从左到右加载值依次压入操作数栈
- 实际先算哪个,看运算符优先级
- 自增、自减操作都是直接修改变量的值,不经过操作数栈
- 最后的赋值之前,临时结果也是存储在操作数栈中