`
caoruntao
  • 浏览: 475918 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

Java i++原理及i=i++的问题说明

    博客分类:
  • java
 
阅读更多

[转]http://blog.sina.com.cn/s/blog_605f5b4f0100khy0.html

学习过一门计算机语言的人一定知道j=i++的运算结果,整个表达式的值为i,而i的值变为i+1;那么i=i++又是一个什么情况呢?下面分别用java 和 c 两种语言来做个测试:

  JAVA:

  public class test

  {

  public static void main(String args[])

  {

  inti,j;

  i=0;

  for(j=0;j<5;j++)

  {

  i=i++;

  System.out.println("i="+i);

  }

  }

  }

  C:

  #include

  main()

  {

  inti,j;

  i=0;

  for(j=0;j<5;j++)

  {

  i=i++;

  printf("i=%d\n",i);

  }

  }

  你也许会问,这么简单的程序会有什么问题呢?是的,如果不相信的话,你可以运行一下这两个程序,得到的结果非常让人震惊。

  第一个JAVA程序得出的结果如下:

  i=0

  i=0

  i=0

  i=0

  i=0

  而第二个C程序得出的结果如下:

  i=1

  i=2

  i=3

  i=4

  i=5

  同样都是i=i++,为什么得出的结果会有这么大的差异呢?原来是在编译器上出了问题,java的编译器在遇到i++和i- -的时候会重新为变量运算分配一块内存空间,以存放原始的值,而在完成了赋值运算之后,将这块内存释放掉,下面首先看一下如果是j=i++的情况:

 

 i的原始值存放在后开辟的内存中,最后这个值将赋值给j,这样j=i++后,j就会得到i的值,而i又将自加,所以,在释放内存之后,原来存放j和i的地方将得到值将是:j(此时的值等于初始i值)和i(i自加后的值)。

  明白了上面的问题,让我们接下来看看i=i++的情况:



 

所以这样最后一次循环内的结果仍旧是i(即0)。

  而C语言中的i=i++就只是完成i++的内容,所以结论会不同。这种情况说明java和c的处理语法的机制不同,如果在程序中只输入i++就不会出现这个方面的问题,所以大家在以后的程序中如果使用到i=i++的时候要格外小心,一般只需要用i++就不会有问题了。


 

  • 大小: 21.9 KB
  • 大小: 21.1 KB
分享到:
评论

相关推荐

    java中for(int i= 0; i<=10;i=i++)System.out.print(i);为什么无限输出0

    为了避免无限循环的发生,正确的做法是直接使用`i++`或者`i += 1`来更新循环变量: ```java public class Test { public static void main(String[] args) { for (int i = 0; i &lt;= 10; i++) { System.out.print...

    Java2+学习指南.zip

    8. **Java I/O与NIO**:学习传统的I/O流以及Java NIO(New IO)框架,提供非阻塞I/O操作。 9. **反射与注解**:了解如何在运行时动态获取类信息,以及注解的使用和自定义注解。 在认证参考部分,可能涉及以下内容:...

    Java实现杨辉三角

    i++) { triangle[i] = new int[i + 1]; triangle[i][0] = triangle[i][i] = 1; // 计算中间的数字 for (int j = 1; j &lt; i; j++) { triangle[i][j] = triangle[i - 1][j - 1] + triangle[i - 1][j]; } } ...

    01背包问题JAVA源码+WORD文档

    说明文档则可能对01背包问题的背景、动态规划的原理、代码实现的逻辑进行详细解释,同时提供示例来帮助理解。它可能还会包括如何运行和测试代码,以及可能的输出结果和其含义。 通过这个作业,学生可以深入理解01...

    java图片滑动验证(登录验证)原理与实现方法详解

    Java图片滑动验证(登录验证)原理与实现方法详解 Java图片滑动验证(登录验证)是一种常用的身份验证机制,它可以有效地防止机器人和恶意攻击。下面将详细介绍Java图片滑动验证(登录验证)的原理和实现方法。 ...

    深入分析Java++Web技术内幕++修订版PDF

    《深入分析Java++Web技术内幕...同时,提供的"Linux公社.png"可能是相关社区或资源的标识,"教程重要说明及更新链接点击这个文本.txt"则可能包含重要提示和更新信息,读者应当仔细阅读,以充分利用这份宝贵的教育资源。

    八种排序算法原理及Java实现( 冒泡排序+快速排序直接插入排序+希尔排序+选择排序+归并排序+基数排序)

    八种排序算法原理及Java实现 排序算法是计算机科学中一种重要的算法,用于对数据进行排序。八种排序算法原理及Java实现是排序算法中的一种,包括冒泡排序、快速排序、直接插入排序、希尔排序、选择排序、归并排序和...

    JavaVM运作原理

    ### Java虚拟机(JVM)运作原理 #### 一、引言 Java虚拟机(JVM)作为Java程序的运行环境,对于理解Java程序的行为至关重要。本文将深入探讨JVM的基本概念及其内部工作原理,帮助读者更好地理解Java程序如何在JVM上...

    java代码-i=3; a=i++; i+=a; \u6c42i=

    i+=a; \u6c42i`涉及到了变量的初始化、自增操作以及赋值运算。让我们深入理解这段代码的含义及其背后的原理。 首先,`i=3;`这行代码初始化了一个整型变量`i`,并将其值设置为3。这是程序开始执行时`i`的状态。 接...

    JAVA(教你如何面试+Web开发重点讲述+常见问题及解析)

    最后,"36个有关JAVA文档(知识点+程序员不知道的问题及分析+程序员必知要点)"这一资源提供了深入的Java知识点解析,可能包括JVM内存模型、异常处理的最佳实践、设计模式的应用、单元测试的重要性等。这些都是Java...

    冒泡排序原理和JAVA实现

    冒泡排序原理和JAVA实现 冒泡排序是一种比较排序,也称为泡沫排序或沉沦排序。它的工作原理是通过重复地走访过要排序的数列,依次比较相邻的两个元素,如果他们的顺序错误就把他们交换过来,直到没有再需要交换的...

    达内javaPPT课件+java面试基础复习

    3. 面试问题:如Java内存模型、JVM调优、线程同步原语(synchronized, volatile, Lock等)、集合框架的深入理解。 4. Java核心技术:如反射、泛型、枚举、注解等。 5. 高级话题:如JVM内存结构、垃圾回收机制、类...

    Java程序员+上班那点事儿

    《Java程序员+上班那点事儿》可能会提供一系列的面试策略,如如何准备常见的Java面试问题,比如JVM工作原理、垃圾回收机制、设计模式的应用等。书中还可能分享如何应对技术面试中的算法题,比如排序算法、查找算法...

    java 记事本+源代码

    - **Java I/O教程**:理解文件读写操作的原理和方法。 通过研究这个Java记事本的源代码,初学者可以了解如何将理论知识应用于实际项目,加深对Java GUI编程的理解,为后续的Java Web或Java EE开发打下坚实基础。...

    java+多线程+同步详解Java源码

    在Java中,多线程允许同时执行多个代码段,从而提高程序的执行效率,特别是在处理I/O密集型或计算密集型任务时。同步机制则用于在多线程环境下控制资源的访问,确保数据的一致性和完整性。 一、Java多线程 1. **...

    java疑难问题解惑

    在Java中,自增运算符(++)有两种用法:前缀形式(++i)和后缀形式(i++)。这两种形式在语义上有所差异,主要体现在返回值和变量更新的时间点上。 1. 前缀形式(++i):首先将i的值增加1,然后返回增加后的值。...

    java反射原理及作用

    根据提供的文件信息,我们可以深入探讨Java反射机制的基本原理及其应用场景。 ### Java反射机制的基本概念 Java反射机制允许程序在运行时获取类的信息,并且能够直接操作这些信息。这包括类名、方法名称、参数类型...

    java阻塞i/o与非阻塞i/o控制

    在Java编程环境中,I/O(输入/输出)操作是程序与外部世界交互的关键部分,包括读取文件、网络通信等。对于高效的系统设计,理解并掌握阻塞I/O和非阻塞I/O是非常重要的。这两种I/O模型在处理数据传输时有着显著的...

    JAVA验证码原理及实现

    i++) { sb.append(chars.charAt(random.nextInt(chars.length()))); } return sb.toString(); } ``` 2. **图像创建**:生成的随机字符串需要转化为图形表示。JAVA的`Graphics2D`和`BufferedImage`类可以用来...

Global site tag (gtag.js) - Google Analytics