全球主机交流论坛

标题: java中的i-=i++是怎么算的 [打印本页]

作者: yeyeyeping    时间: 2020-12-25 10:07
标题: java中的i-=i++是怎么算的
本帖最后由 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
作者: rtz    时间: 2020-12-25 10:08
把我的哈佛望远镜拿来,我看看
作者: h20    时间: 2020-12-25 10:10
提示: 作者被禁止或删除 内容自动屏蔽
作者: maintell    时间: 2020-12-25 10:11
你发图发成这个样子,太过分了,故意的吗
作者: yeyeyeping    时间: 2020-12-25 10:12
rtz 发表于 2020-12-25 10:08
把我的哈佛望远镜拿来,我看看

不好意思,没想到论坛图片压缩的这么厉害,代码已经贴上去了
作者: Nothing1024    时间: 2020-12-25 10:14
本帖最后由 Nothing1024 于 2020-12-25 10:15 编辑

图糊了就不发了
可以看看运算符相关+调用栈相关
作者: 403_Forbidden    时间: 2020-12-25 10:14
i-代表要减去后面的数,后面i++代表先取值2再自增,所以相当于2-2
作者: yeyeyeping    时间: 2020-12-25 10:17
maintell 发表于 2020-12-25 10:11
你发图发成这个样子,太过分了,故意的吗

不好意思不好意思,不知道图片被压缩的的这么厉害
作者: puamn    时间: 2020-12-25 10:18
i-=i = i - i = 0
作者: Syc    时间: 2020-12-25 10: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,然后再进行赋值。
作者: yeyeyeping    时间: 2020-12-25 10:41
Syc 发表于 2020-12-25 10:19
i++是先拷贝一份加入栈参与运算,后自增。

抛开前面 i- 不管,我们来看 i=0; i=i++;  最终结果不是1而是0 ...

懂了,多谢
作者: leven5    时间: 2020-12-25 10:45
先理解++i和i++的区别
就明白为什么是零了
作者: 半世烟尘    时间: 2020-12-25 11:56
先自增后运算和先运算后自增是两码事
作者: 2han9wen71an    时间: 2020-12-25 14:02
相当于2-2
作者: 奔跑吧蜗牛c    时间: 2020-12-25 14:14
int i=2;
i-=i++;

2-=2;
i=2-2;
i=0;
作者: ABCHINA    时间: 2020-12-25 14:17
这是编译以后的运算
  1. int i = 2;
  2.         byte var10000 = i;
  3.         byte var10001 = i;
  4.         int i = i + 1;
  5.         i = var10000 - var10001;
  6.         System.out.println(i);
复制代码

作者: cscool    时间: 2020-12-25 14:29
别去纠结这个 现实一般i++都是单独写的 代码要清晰易读
作者: 369    时间: 2020-12-25 14:40
和 i-=i  一个意义
作者: 小怪    时间: 2020-12-25 14:46
   int i=2;
//这时 i++, i=3
由于是 i-= ;
i减等 就相当于 减 自己3-3=0;
i-=i++;




欢迎光临 全球主机交流论坛 (https://mjj.022333.xyz/) Powered by Discuz! X3.4