关于a++——后自增符号

之前老师在上课中提到,后自增符号是先以原值参与其他运算再进行自增运算。考虑到后自增结果只能为右值,于是尝试了以下段代码:

int a=0;
a=a++;

打印a的值为0,也就是说并非是简单地先将a的值赋给a,然后再进行自增运算。
参考以下一个关于变量id的自增操作

【Kevin原创】关于Java自增操作的原子性

public void getNext();
  Code:
   0:   aload_0         //加载局部变量表index为0的变量,在这里是this 
   1:   dup                 //将当前栈顶的对象引用复制一份
   2:   getfield        #2; //Field id:I,获取id的值,并将其值压入栈顶
   5:   iconst_1            //将int型的值1压入栈顶
   6:   iadd                //将栈顶两个int类型的元素相加,并将其值压入栈顶
   7:   putfield        #2; //Field id:I,将栈顶的值赋值给id
   10:  return

}

可以看到对变量有个先取值再赋值的过程。看起来java的后自增操作的实现应该类似于这样:

  (伪码)
  int increment(a){       //对a进行后自增操作
      temp = a ;           //将a的值拷贝给一个临时变量
      a=a+1;               //将a+1的值给a
      return temp;
  }

也就是说,后自增操作一旦发生,则同时产生了一个temp变量以及将a的值增加了1。然后temp变量参与外部运算。这可以解释

int a=0;
a=a++;

执行后打印a的值为什么是0,因为a=a++的操作是先将0赋给一个临时变量temp,然后a变成1,最后把temp中的0再给a。
我们还可以看下面一个例子:

int a=0;
int b=a++ + ++a;

输出结果b=2,执行过程为b=temp(0)+a(1+1)。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值