一、赋值操作
赋值操作的操作顺序是从右到左
先计算赋值操作符右边的公式,在赋值给左边变量
二、先运算,再赋值
+=即自加
i+=2;
等同于
i=i+2;
其他的 -= , *= , /= , %= , &= , |= , ^= , >>= , >>>= 都是类似,不做赘述
三、问题研究
1、i的最终结果是?
int i = 1;
i+=++i;
2、结果
3
3、错误答案及原因:
4,因为误会是2+=2了。
4、原因分析
int i = 1; i+=++i; 理解 就是 i = i + ++i
解析:抛开静态情况。栈帧存储了方法的局部变量表,操作数栈,动态连接和方法返回地址等信息。
首先代码执行过程是:
0: iconst_1 将常量1压入操作数栈。此时栈顶值为1.
1: istore_1 将栈顶元素弹出(值1),存入到局部变量表index为1的位置。这里一般index为0的位置存储的是当前实例。想象下局部变量结构【当前实例,1】
2: iload_1 将局部变量表index的位置值复制一份到操作数栈。栈顶值为1
3: iinc 1, 1 iinc就是进行自增操作 第一个1是操作局部变量表index为1的值,第二个值表示增加的数量 ,也就是++i 等价于i = i+1;1+1=2.把结果存放到局部变量表index为1里面
4: iload_1 将局部变量index为1的值(此刻为2) 存一份到操作数栈。此时操作栈存了 之前的1 和这次的2
5: iadd 这个命令是将操作栈里前俩个值相加 1+2 =3 ,把结果放在栈顶
6: istore_1 将栈顶元素弹出(值3) 存到局部变量index为1的位置 也就是i = 3
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/103263.html