当前位置: 首页 > 编程笔记 >

java中的自增问题介绍

单品
2023-03-14
本文向大家介绍java中的自增问题介绍,包括了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中的自增问题介绍就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持小牛知识库。

 类似资料:
  • 对社区来说是非常新的。我想知道是否有人能解释为什么我上次的println会产生编译错误?非常感谢。

  • 我在实体中有以下Id描述: 生成此id的分解指令如下: 此外,我还有一些分解脚本,可以在此表中插入预定义的值,例如。 当我尝试使用Jpa存储库插入没有id的新记录时,问题出现了。我收到了一条类似“重复id”的错误消息。所以,我知道jpa(hibernate)不使用postgresql序列来获取新的id值。我不想在实体的id描述中包含序列名。我希望postgresql本身能够解决这种情况。我不会使用

  • 问题内容: 因此,我只是站了一个Spring Hibernate应用程序,似乎无法正确映射文件。我正在使用MySql 5和一个自动递增键。这是我的映射文件的ID部分。 这是生成的SQL 插入联系人(标题,名字,中间名,姓,后缀,职务,职位,护照号码,护照过期,雇主,饮食限制,secondary_contact_fname,secondary_contact_lname,secondary_cont

  • 本文向大家介绍java中String类型变量的赋值问题介绍,包括了java中String类型变量的赋值问题介绍的使用技巧和注意事项,需要的朋友参考一下 运行下面这段代码,其结果是什么? 结果如下: 解说: java 中String是 immutable的,也就是不可变,一旦初始化,其引用指向的内容是不可变的(注意:是内容不可变)。 也就是说,假设代码中有String str = “aa”;str=

  • 本文向大家介绍MySql数据库自动递增值问题,包括了MySql数据库自动递增值问题的使用技巧和注意事项,需要的朋友参考一下 在数据库应用,我们经常要用到唯一编号,以标识记录。在MySQL中可通过数据列的AUTO_INCREMENT属性来自动生成。MySQL支持多种数据表,每种数据表的自增属性都有差异,这里将介绍各种数据表里的数据列自增属性。 ISAM表 如果把一个NULL插入到一个AUTO_INC

  • 问题内容: Java中的“自动递增”字母-这可能吗?从A到Z而没有第三方库? 问题答案: 是的,您可以这样做: 类型转换也是可能的: