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文件
可以看到如下类似指令:
- .class
- 0: bipush 0 将参数0压入栈;
- 2: istore_1 栈中弹出一个数,赋给局部变量:i
- 3: bipush 0 将参数0压入栈;
- 5: istore_2 栈中弹出一个数,赋给不存在变量:tmp_i
- 6: iload_2 将第二个不存在变量tmp_i的值入栈,此时栈顶的值为0
- 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