第一眼看到这种题,心里mmp,这么简单也放出来.看了答案,答错了,心中无数的cnm 神兽略过.
答案为3.想这么简单的题,又找不到原因,我一般是直接用工具把class文件解析字节码.以下为解析的代码:
0 iconst_3 将常量 3 push 到栈顶
1 istore_1 从栈顶pop 存储到局部变量表 索引为1
2 iload_1 读取在局部变量表索引为1的变量,并push 栈顶中 ,这时栈顶为3
3 iinc 1 by 1 这个操作是在局部变量表中进行的,并没有push 到栈顶.这时索引为1的局部变量为4
6 istore_1 从栈顶pop 存储到局部变量表 索引为1.栈顶的值为3,覆盖掉索引为1的局部变量的值
7 getstatic #2 <java/lang/System.out>
10 iload_1 读取在局部变量表索引为1的变量,并push 栈顶中 ,这时栈顶为3
11 invokevirtual #3 <java/io/PrintStream.println> 这时会打印出3
14 return
如果i=i++改成 i=++i; 会成什么样子:
答案为4:
0 iconst_3
1 istore_1
2 iinc 1 by 1
5 iload_1
6 istore_1
7 getstatic #2 <java/lang/System.out>
10 iload_1
11 invokevirtual #3 <java/io/PrintStream.println>
14 return
这个是不用继续解释了,就25 调换位置跟第一个就一样了.这也就说明前缀++ ,是先自加后赋值,后缀++,先赋值后自加这一也是造成i为3的的原因(赋值push 到栈顶,自加后又从栈顶赋值到局部,不明白就看第一个解释)