java的i++和++i
说来惭愧,最近在刷面试题,一道有关于i++和++i的题竟然做错了!网上查了一圈恍然大悟。下面结合我的理解来说说这个问题,避免面试踩坑啊。
准备接招吧
package com.example.demo;
/**
* @Author: junwe
* @Date: 2021/2/27 23:15
*/
public class Test {
public static void main(String[] args) {
int i = 6;
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);
}
}
下面揭晓答案了
如果和你想的一样,恭喜你不用再往下看了。
要做对这题,需要弄清楚局部变量和操作数栈。先看一下main方法对应的字节码(idea查看字节码:右键.class文件,open in terminal,在命令行输入javap -v 类名),“##”的部分是我加的注释。
public static void main(java.lang.String[]);
descriptor: ([Ljava/lang/String;)V
flags: ACC_PUBLIC, ACC_STATIC
Code:
stack=3, locals=4, args_size=1
0: bipush 6 #6入栈#
2: istore_1 #6出栈,赋值给第一个变量i。0-2对应代码int i = 6;#
3: iload_1 #第一个变量6入栈#
4: iinc 1, 1 #第一个变量i=6+1,此时局部变量i=7#
7: istore_1 #6出栈,赋值给第一个变量i,此时局部变量的值被覆盖为6。3-7对应代码i = i++;#
8: iload_1 #第一个变量6入栈#
9: iinc 1, 1 #第一个变量加一,此时局部变量i=7#
12: istore_2 #6出栈,赋值给第二个变量j。此时j=6。8-12对应代码int j = i++;#
13: iload_1 #第一个变量7入栈#
14: iinc 1, 1 #第一个变量加一,此时局部变量i=8#
17: iload_1 #第一个变量8入栈#
18: iload_1 #第一个变量8入栈#
19: iinc 1, 1 #第一个变量加一,此时局部变量i=9#
22: imul #栈中的两个8分别出栈相乘后64入栈#
23: iadd #64和栈低的7出栈相加后71入栈#
24: istore_3 #71出栈赋值给第三个变量k#
没看懂?再来一张图