java中的自增问题介绍


运行下面这段代码,其结果是什么呢?

package com.test;

public class Inc {
  
  public static void main(String[] args) {
    Inc inc = new Inc();
    int i = 0;
    inc.fermin(i);
    i = i++;
    System.out.println(i);
  }

  void fermin(int i) {
    i++;
  }
}

结果是:0

上述类似代码在C/C++中运行结果是:1,这是为什么呢?
 

这是因为Java使用了中间缓存变量机制:
i=i++;等同于:
temp=i; (等号右边的i)
i=i+1;      (等号右边的i)
i=temp;   (等号左边的i)
而i=++i;则等同于:
i=i+1;
temp=i;
i=temp;


详解:

jvm里面有两个存储区,一个是暂存区(是一个堆栈,以下称为堆栈),另一个是变量区。

jvm会这样运行这条语句:

步骤1   jvm把i的值(其值是0)拷贝到临时变量区(temp=0)。

步骤2 变量区i的值加1,这时i的值是1。

步骤3 返回临时变量区(temp)的值,注意这个值是0,没修改过。

步骤4 返回值赋值给变量区的i,此时i的值被重置成0。


 c/c++中没有另外设置一个临时变量或是临时空间来保存i,所有操作都是在一个内存空间中完成的,所以在c/c++中是1。

以上这篇java中的自增问题介绍就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持phpstudy。



相关阅读:
使用JS获取当前地理位置方法汇总
js分页代码分享
SQLite学习手册(SQLite在线备份)
Android解决dialog弹出时无法捕捉Activity的back事件的方法
解决 Xcode 6-Beta2 智能提示bug
JavaScript实现的一个倒计时的类
Objective C从远程url下载图片方法汇总
js/jquery判断浏览器的方法小结
JS实现新浪微博效果带遮罩层的弹出框代码
java获取两个数组中不同数据的方法
adonet基础示例分享(adonet连接数据库)
android开发教程之实现toast工具类
jQuery对象与DOM对象之间的相互转换
JS实现FLASH幻灯片图片切换效果的方法
快速导航

Copyright © 2016 phpStudy |