关于 Java 的自增运算符可能产生的 bug

面试的时候被问到的一个问题。

1
2
3
4
5
6
7
public class Test {
public static void main(String[] args) {
int i = 0;
i = i++;
System.out.println(i);
}
}

这段代码执行之后,i 的值是多少?

是 10 吗?

正确答案其实是 0。

可以通过反编译来看一下这段代码的字节码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class Test extends java.lang.Object{
public Test();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: iconst_2
1: istore_1
2: iload_1
3: iinc 1, 1
6: istore_1
7: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
10: iload_1
11: invokevirtual #3; //Method java/io/PrintStream.println:(I)V
14: return
}

// TODO 有待填坑

参考资料

  1. 当i = i++时,究竟发生了什么?
  2. 关于带副作用的表达式的一点笔记
  3. Java 自加运算符,j = j++,j 的值为什么没有变?
  4. Linux gcc for 循环中 i=i++ 会造成死循环问题及 ++i / i++ 汇编分析