各位大佬,java中i-=i++施怎么算的,为啥下面这个结果是0
代码:
publicclassHelloWorld{
publicstaticvoidmain(String[]args){
inti=2;
i-=i++;
System.out.println(i);
}
}
//打印结果:0
-----------------------------------------------------
网友回复:
i++是先拷贝一份加入栈参与运算,后自增。
抛开前面i-不管,我们来看i=0;i=i++; 最终结果不是1而是0。
编译后用jdk自带工具反编译.class文件
可以看到如下类似指令:
.class
0:bipush0将参数0压入栈;
2:istore_1栈中弹出一个数,赋给局部变量:i
3:bipush0将参数0压入栈;
5:istore_2栈中弹出一个数,赋给不存在变量:tmp_i
6:iload_2将第二个不存在变量tmp_i的值入栈,此时栈顶的值为0
7:iinc2,1指令iinc对给定的局部变量做自增操作
网友回复:
引用:rtz发表于2020-12-2510:08
把我的哈佛望远镜拿来,我看看
网友回复:
图糊了就不发了
可以看看运算符相关+调用栈相关
网友回复:
i-代表要减去后面的数,后面i++代表先取值2再自增,所以相当于2-2
网友回复:
引用:maintell发表于2020-12-2510:11
你发图发成这个样子,太过分了,故意的吗
网友回复:
i++是先拷贝一份加入栈参与运算,后自增。
抛开前面i-不管,我们来看i=0;i=i++; 最终结果不是1而是0。
编译后用jdk自带工具反编译.class文件
可以看到如下类似指令:
.class
0:bipush0将参数0压入栈;
2:istore_1栈中弹出一个数,赋给局部变量:i
3:bipush0将参数0压入栈;
5:istore_2栈中弹出一个数,赋给不存在变量:tmp_i
6:iload_2将第二个不存在变量tmp_i的值入栈,此时栈顶的值为0
7:iinc2,1指令iinc对给定的局部变量做自增操作
网友回复:
引用:Syc发表于2020-12-2510:19
i++是先拷贝一份加入栈参与运算,后自增。
抛开前面i-不管,我们来看i=0;i=i++; 最终结果不是1而是0...
网友回复:
先理解++i和i++的区别
就明白为什么是零了
网友回复:
inti=2;
i-=i++;
2-=2;
i=2-2;
i=0;
网友回复:
别去纠结这个现实一般i++都是单独写的代码要清晰易读
网友回复:
inti=2;
//这时i++,i=3
由于是i-=;
i减等就相当于减自己3-3=0;
i-=i++;