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


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




a++:  操作直接对局部变量进行自增操作不涉及操作数栈

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



分析"一个很伤脑的笔试题"_第1张图片





感谢<Java虚拟机规范>的汉化者.

你可能感兴趣的:(笔试题)