字节码文件的学习

关于a++和++a

java 学习之路

int a = 10;
int b = a++ + ++a + a-- + --a;

System.out.println(a);
System.out.println(b);

输出结果为:

10
44

使用 javap -v Demo.class 得到反编译之后的文件
iinc 指令是在局部变量 solt 直接运算

         0: bipush        10				  // 加载常量 10 到操作数栈
         2: istore_1						  // 把槽位1的值弹出栈(a=10)
         3: iload_1							  // 槽位1压入操作数栈(a++);a=10
         4: iinc          1, 1				  // 槽位1,进行 +1;
         7: iinc          1, 1				  // 槽位1,执行 +1(++a); 
        10: iload_1							  // 槽位1压入操作数栈;a=12
        11: iadd							  // 运算a++ + ++a = 10 + 12 
        12: iload_1							  // 槽位1压入操作数栈(a--); a=12
        13: iinc          1, -1				  // 槽位1,执行 -1;
        16: iadd							  // 运算 + a--; 22 + 12
        17: iinc          1, -1				  // 槽位1,执行 -1(--a);
        20: iload_1							  // 槽位1压入操作数栈; a=10
        21: iadd							  // 运算 + --a = 34 + 10 
        22: istore_2						  // 结果弹出操作数栈 b= a++ + ++a + a-- + --a;
        23: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
        26: iload_1
        27: invokevirtual #3                  // Method java/io/PrintStream.println:(I)V
        30: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
        33: iload_2
        34: invokevirtual #3                  // Method java/io/PrintStream.println:(I)V
        37: return
int i = 0,j = 0;
while(i < 5) {
	j = j++;
	i++;
}
System.out.println(j);

输出结果为:

0

分析:
j++ 操作分两步进行,先 iload 之后 iinc,且 iinc 的操作是在槽位进行;iload 时操作数栈中 j 的值为 0,槽位的值才为 1 。再次循环 j 的值还是为 0。
j = j++; 代码变为 j = ++j; 则输出结果为 5;先进行 iinc +1 ,j 的值变为 1 ,再加载 j 压入操作数栈。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值