i = i++和 i = ++i

头疼

直接上题:


public class Test {
    public static void main(String[] args) {
        int i = 1;
        i = i++;
        int j = i++;
        int k = i + ++i * i++;
        System.out.println(i);
        System.out.println(j);
        System.out.println(k);
    }
}
//答案
i=4
j=1
k=11

看一下字节码:

 0 iconst_1
 1 istore_1
 2 iload_1
 3 iinc 1 by 1
 6 istore_1
 7 iload_1
 8 iinc 1 by 1
11 istore_2
12 iload_1
13 iinc 1 by 1
16 iload_1
17 iload_1
18 iinc 1 by 1
21 imul
22 iadd
23 istore_3
24 getstatic #2 <java/lang/System.out : Ljava/io/PrintStream;>
27 iload_1
28 invokevirtual #3 <java/io/PrintStream.println : (I)V>
31 getstatic #2 <java/lang/System.out : Ljava/io/PrintStream;>
34 iload_2
35 invokevirtual #3 <java/io/PrintStream.println : (I)V>
38 getstatic #2 <java/lang/System.out : Ljava/io/PrintStream;>
41 iload_3
42 invokevirtual #3 <java/io/PrintStream.println : (I)V>
45 return

看一下局部变量表:
在这里插入图片描述
看一下虚拟机栈的结构:
在这里插入图片描述
1.第一步
int i = 1
在这里插入图片描述
2.第二步
i = i++
在这里插入图片描述
3.第三步
int j = i++
在这里插入图片描述
3.第四步
int k = i + ++i * i++
这个可以写成: int k = i+ ((++i) * (i++)) 注意,乘法优先级高,字节码上也能体现出来
在这里插入图片描述

总结:就是通过分析字节码,是怎样一步步执行的,要注意的点,就是局部变量表load出来放进操作数栈,注意是栈结构,然后又store存入局部变量表。这样一个过程。所以要深刻理解代码执行逻辑和顺序,以及代码执行优先级,才能应付复杂计算。

最后的最后:本文的思考过程和计算推导仅针对Java语言

转载来自:https://urlify.cn/Abyuyy

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值