面试题:求输出i的值?
public class TestMain {
public static void main(String[] args) {
int i=0;
i=i++;
System.out.println(i);
}
}
结果
正常代码
所以这个题正确回答方式是什么呢?
1、回答为什么i=i++ 最后i=1;2、否定i=i++这种写法,提供其他写法如:i=i+1;
从字节码上来分析i=i++是非常简单方便的,为了区别出来我把i换成了来表示;
public static void main(java.lang.String[]);
Code:
0: iconst_0
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: new #3 // class java/lang/StringBuilder
13: dup
14: invokespecial #4 // Method java/lang/StringBuilder."<init>":()V
17: ldc #5 // String a=
19: invokevirtual #6 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
22: iload_1
23: invokevirtual #7 // Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
26: invokevirtual #8 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
29: invokevirtual #9 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
32: return
0: iconst_0 # 常量0加载到操作数栈
1: istore_1 # 将0从操作数栈存储到局部变量表 第2个位置
2: iload_1 #加载局部变量第1个变量压入操作数栈
3: iinc 1, 1 #局部变量表1位置的值自增1
6: istore_1 #重新将操作数栈顶的值0出栈存入局部变量表1的位置处
结果很明显,自增操作的是局部变量表,i= 操作是取操作数栈栈顶的值存到局部变量表中。所以在这里0把自增的值覆盖掉了。 后续的打印取得是局部变量表中覆盖后的值所以,打印的是0.