java中的i-=i++是怎么算的
侧边栏壁纸
  • 累计撰写 56,740 篇文章
  • 累计收到 0 条评论

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

James
2021-01-19 / 0 评论 / 67 阅读 / 正在检测是否收录...

各位大佬,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++;

0