全球主机交流论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

CeraNetworks网络延迟测速工具IP归属甄别会员请立即修改密码
查看: 1451|回复: 18

java中的i-=i++是怎么算的

[复制链接]
发表于 2020-12-25 10:07:38 来自手机 | 显示全部楼层 |阅读模式
本帖最后由 yeyeyeping 于 2020-12-25 10:10 编辑

各位大佬,java中i-=i++施怎么算的,为啥下面这个结果是0
代码:
public class HelloWorld {
    public static void main(String []args) {
                int i=2;
                i-=i++;
       System.out.println(i);
    }
}
//打印结果:0
发表于 2020-12-25 10:19:19 | 显示全部楼层
本帖最后由 Syc 于 2020-12-25 10:21 编辑

i++是先拷贝一份加入栈参与运算,后自增。

抛开前面 i- 不管,我们来看 i=0; i=i++;  最终结果不是1而是0。
编译后用jdk自带工具反编译.class文件
可以看到如下类似指令:
  1. .class
  2. 0: bipush 0 将参数0压入栈;
  3. 2: istore_1 栈中弹出一个数,赋给局部变量:i
  4. 3: bipush 0 将参数0压入栈;
  5. 5: istore_2 栈中弹出一个数,赋给不存在变量:tmp_i
  6. 6: iload_2 将第二个不存在变量tmp_i的值入栈,此时栈顶的值为0
  7. 7: iinc 2, 1 指令iinc对给定的局部变量做自增操作
复制代码


出栈还是0,瞎忙活。说通俗些,你可以把++看成一个函数, 参数为i, 函数返回值是自增前的i,然后再进行赋值。
发表于 2020-12-25 10:08:59 | 显示全部楼层
把我的哈佛望远镜拿来,我看看
发表于 2020-12-25 10:10:54 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
发表于 2020-12-25 10:11:51 | 显示全部楼层
你发图发成这个样子,太过分了,故意的吗
 楼主| 发表于 2020-12-25 10:12:56 | 显示全部楼层
rtz 发表于 2020-12-25 10:08
把我的哈佛望远镜拿来,我看看

不好意思,没想到论坛图片压缩的这么厉害,代码已经贴上去了
发表于 2020-12-25 10:14:15 | 显示全部楼层
本帖最后由 Nothing1024 于 2020-12-25 10:15 编辑

图糊了就不发了
可以看看运算符相关+调用栈相关
发表于 2020-12-25 10:14:49 | 显示全部楼层
i-代表要减去后面的数,后面i++代表先取值2再自增,所以相当于2-2
 楼主| 发表于 2020-12-25 10:17:04 来自手机 | 显示全部楼层
maintell 发表于 2020-12-25 10:11
你发图发成这个样子,太过分了,故意的吗

不好意思不好意思,不知道图片被压缩的的这么厉害
发表于 2020-12-25 10:18:10 | 显示全部楼层
i-=i = i - i = 0
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|全球主机交流论坛

GMT+8, 2024-5-5 15:12 , Processed in 0.078418 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表