什么是字节码指令
字节码指令就是由一个字节长度的操作吗和操作数组成,有些只有操作码,没有操作数
例如: bipush 10 第一个参数就是操作码,第二个是操作数
a++和i++有什么区别
public static void main(String[] args) {
int a=10;
a++;
System.out.println(a);
}
在字节码中,都是一样的内容,所以没有区别
a=a++的返回值是多少
输出的结果为10
public static void main(String[] args) {
int a=10;
a=a++;
System.out.println(a);
}
我们来看下字节码指令
局部变量表0的位置是this
bipush 10
就是把10 压入操作数栈
istore_1
就是把操作栈的数据10 放入局部变量表,索引为1的位置中,并且把操作数栈中的10,出栈
iload_1
就是把局部变量表索引位置为1的数据10,在放入到操作数栈中
iinc 1 by 1
就是把局部变量表 索引位置为1 的数据10 加1,变成11
istore_1
再次把操作栈的数据10,放入局部变量表,索引位置为1的地方,把11覆盖,变成10
并且操作数栈的数据10 出栈
iload_1
再次把局部变量表中索引位置为1的数据10 ,放入操作数栈
System.out 和PrintStream.println 结合使用
打印操作数栈的数据,也就是返回10
最后的return就是结束
a=++a的返回值是多少
是11
public static void main(String[] args) {
int a=10;
a=++a;
System.out.println(a);
}
我们来分析下字节码指令
bipush 10
把数据10放入操作数栈中
istore_1
把操作数栈中的数据10,放入局部变量表索引位置为1的地方,并且把操作数栈的10,出栈
iinc 1 by 1
把局部变量表 索引位置为1的数据10,给他加1,变成11
iload_1
把局部变量表索引位置为1 的数据11,放入操作数栈中
istore_1
把操作数栈中的数据11,放入局部变量表 索引位置为1的地方,变成11,
并且操作数栈的数据11 出栈
iload_1
把局部变量表 索引位置为1的数据11,放入操作数栈中
System.out PrintStream.println 结合打印出操作数栈中的11 ,所以控制台返回的结果就是11
return 直接停止
a*=a++的值是多少
通过上面的字节码指令分析,可以得出打印的是100=10*10
public static void main(String[] args) {
int a=10;
//a*a++
a*=a++;
System.out.println(a);
}
a*=++a的值是多少
结果是110=10*11
public static void main(String[] args) {
int a=10;
//a* ++a
a*=++a;
System.out.println(a);
}
a=a*(a++)*(++a)的值是多少
10*10*(11+1)=10*10*12=100*12=1200
打印的结果就是1200
public static void main(String[] args) {
int a=10;
a=a*(a++)*(++a);
System.out.println(a);
}