yeyeyeping牛人大佬:

各位牛人大佬,java中i-=i++施怎么算的,为啥下面这个结果是0
代码:
public class HelloWorld {
    public static void main(String []args) {
                int i=2;
                i-=i++;
       System.out.println(i);
    }
}
//打印结果:0

Syc牛人大佬:

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,然后再进行赋值。

rtz牛人大佬:
把我的哈佛望远镜拿来,我看看

h20牛人大佬:
自己看运算符优先级,这点事还要来问

maintell牛人大佬:
你发图发成这个样子,太过分了,故意的吗

yeyeyeping牛人大佬:


把我的哈佛望远镜拿来,我看看

不好意思,没想到论坛图片压缩的这么厉害,代码已经贴上去了

Nothing1024牛人大佬:

图糊了就不发了
可以看看运算符相关+调用栈相关

403_Forbidden牛人大佬:
i-代表要减去后面的数,后面i++代表先取值2再自增,所以相当于2-2

yeyeyeping牛人大佬:

你发图发成这个样子,太过分了,故意的吗

不好意思不好意思,不知道图片被压缩的的这么厉害

puamn牛人大佬:
i-=i = i – i = 0