C语言 & Java 解析:当 i = i++ 后,结果究竟是什么?

前言:

之前有朋友跟我讨论过一个问题,他问在java中,i=1;i=i++;之后的结果时什么,我一开始认为是2,但当他说答案是1的时候,我不得不想一个合理的解释,我想,可能是因为临时变量,当i赋值给i后,自增更改了临时变量,所以i值并没有改变。当我在为我的解释表示满意时,他们说在c语言下的答案是2,好吧,我只能说是编译器的实现不同,当然这个答案太没说服力了,所以寻找答案的任务就开始了。

我先在《c++ primer》上看见这样的解释:“++i的效率要比i++的效率高,因为i++必须要有一个临时变量来存放i本身的值“,那么我之前只说对了临时变量,但原因是临时变量先用来存放i的值,然后i本身自增,之后,临时变量赋值给左边,这时,i的值又被 自己之前的值覆盖了,所以又变成1,但这只是个推测,再说c语言中为什么是2?所以不得不反编译了。。。

java的jdk自带一个工具,javap,可以反编译,我们用它java编译器生成的“jvm版汇编码”,我会写下两段代码用来做对比,一种是i=i++;一种常见的j=i++;注意,我使用2作为初始值(也就是说它会被自增为3),因为1太特殊了,它在字节码中的变量名随处可见,而且++不是加1么,所以我用2做初值,也方便查找。

publicclassTest{

publicstaticvoidmain(String[] args){

inti =2;

  i = i++;

  System.out.println(i);

  }

}

javap -c Test 的字节码如下:

public class Test extends java.lang.Object{

public Test();

  Code:

  0: aload_0

  1: invokespecial #1; //Method java/lang/Object
  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值