分析"一个很伤脑的笔试题"

int a=2;
int b=a+3*a++;
System.out.print(b);


b=???

我的第一反应应该是 b=9; 因为a++,操作应该会把第一个a的值变成3;
也就是说 b= 3 + 3 * 2 = 9;

结果是错的. 显示的是8.

分析一下啊:

public static void main(java.lang.String[] args);
0 iconst_2 // 将int数[_2=2]压入操作时栈中; 当前操作数栈为: 2
1 istore_1 [a] //将int数据保存到局部变量表中[_1=变量表的索引值]; 当前操作数栈为: 空
2 iload_1 [a] //从局部变量表中加载一个int类型的变量放到操作数栈中; 当前操作数栈为:a=2
3 iconst_3 //将int数[_3=3]压入操作时栈中; 当前操作数栈为: 3,a=2,
4 iload_1 [a] //从局部变量表中加载一个int, 放入操作数栈中; 当前操作数栈为: a=2, 3,a=2,
5 iinc 1 1 [a] //将指定int型变量增加指定值。 a++只有iinc指令直接对局部变量进行自增操作不涉及操作数栈; 当前操作数栈为: a=2,3,a=2,
8 imul //乘法指令; 当前操作数栈为: 6, a=2
9 iadd //加; 当前操作数栈为: 8
10 istore_2 [b] //将int数据保存到变量表中; b=8; 当前操作数栈为: 空
11 getstatic java.lang.System.out : java.io.PrintStream [16] //获得静态数据out
14 iload_2 [b] //从局部变量表中加载一个int; 当前操作数栈为:b=8
15 invokevirtual java.io.PrintStream.print(int) : void [22]
18 return
Line numbers:
[pc: 0, line: 6]
[pc: 2, line: 7]
[pc: 11, line: 8]
[pc: 18, line: 9]
Local variable table: //局部变量表
[pc: 0, pc: 19] local: args index: 0 type: java.lang.String[]
[pc: 2, pc: 19] local: a index: 1 type: int
[pc: 11, pc: 19] local: b index: 2 type: int



[color=darkblue][b]a++: 操作直接对局部变量进行自增操作不涉及操作数栈[/b][/color]

很明白了吧. a++没有改变操作数栈, 所以 b = 2 + 3 * 2 = 8;



[img]http://dl.iteye.com/upload/attachment/598239/076957bd-8a82-3664-800e-38c89e116b61.jpg[/img]


感谢<Java虚拟机规范>的汉化者.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值