A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 傲鸽 于 2013-6-25 15:47 编辑
  1. public class Test3 {
  2.     public static void main(String[] args) {
  3.         int j = 0;
  4.         for (int i = 0; i < 100; i++)
  5.               j = j++;
  6.         System.out.println(j);
  7.     }
  8. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 很给力!

查看全部评分

8 个回复

倒序浏览
本帖最后由 ytblght55 于 2013-6-25 03:08 编辑

楼主你看下面的2个函数和你的函数差不多,就是你的打印语句只输出一次,下面定义了2个变量助于理解!
主要问题还是虚拟机运行机制的问题!!!你看下下面的2个例子希望帮助你理解!!!
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<stdio.h>
  
  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++就不会有问题了。



评分

参与人数 1技术分 +2 收起 理由
袁梦希 + 2 很给力!

查看全部评分

回复 使用道具 举报
本帖最后由 ytblght55 于 2013-6-25 02:16 编辑

给分!!!!!
回复 使用道具 举报
本帖最后由 ytblght55 于 2013-6-25 03:09 编辑

给分斑竹!!
回复 使用道具 举报
很好
回复 使用道具 举报
ytblght55 发表于 2013-6-25 01:43
楼主你看下面的2个函数和你的函数差不多,就是你的打印语句只输出一次,下面定义了2个变量助于理解!
主要问题 ...

看你的图 顺序怎么是按照先自加再赋值的??
回复 使用道具 举报

哥们,淡定!不过你的回答不错
只是如果楼主没明白的时候,你要记得继续解释{:soso_e179:}
回复 使用道具 举报
这题挺特别的,这个多少算是 i++ 与 ++i 的区别吧。
另外LZ题中也是因为一点导致都是0,就是 i++ 赋值给的还是 i ,导致每次循环中 初始 i 的值都为0 。
如果写成 h = i ++ ,可能就会不同,当然也没有 i = ++i 来的好。
回复 使用道具 举报
我也看明白了,谢谢楼主提出这样的问题,也感谢大家的解答
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马