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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 傲鸽 中级黑马   /  2013-6-25 01:06  /  2007 人查看  /  13 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 孙百鑫 于 2013-6-30 08:34 编辑
  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 赞一个!

查看全部评分

13 个回复

正序浏览
楼主您好,帖子长时间没有动态我已经将您的帖子改成已解决。如有问题请私密我哦~
回复 使用道具 举报
打印 0 一次

首先for循环没有{},只是j=j++一直在循环,sop输出语句仅执行一次;
其次,关于j=j++; 这里 j的值一直是0,(好像是)在内存中有一个 0的副本

所以最后打印0

回复 使用道具 举报
答案是0,因为变量j并没有参加for循环。
回复 使用道具 举报
public class Test3 {
public static void main(String[] args) {
int j = 0;//给j赋值为0
for (int i = 0; i < 100; i++)//定义了一个for循环,i初始值为0,
j = j++;//j++,但是++在j后边,所以是先赋值给j,然后再执行++,因为上边赋值为j=0,所以这个时候j还是为0
System.out.println(j);//输出j的值为0
}
}
这里考察的主要是前++和后++的问题。如果上边代码的j=j++,改为j=++j;则输出结果为1
回复 使用道具 举报
在JAVA中,会先把j的值拷贝到一个临时变量区,然后在对j变量加1,最后返回临时变量区的值。把j=j++这条语句修改成为j++即可了。
回复 使用道具 举报
找到答案了http://hi.baidu.com/lover_actually/item/e9e7b73eb2e5ba88c2cf2992
回复 使用道具 举报
运行结果是0.我也没想通,如果按照老毕的讲解的话应该不会出现0这个结果啊。现在觉得老毕可能也理解错了。百度了下呢也没得到什么好的答案。http://blog.sina.com.cn/s/blog_71643cb101011z7u.html这里面将了下,至于原理是什么就不知道了
回复 使用道具 举报
ytblght55 发表于 2013-6-25 09:17
楼主你看下面的2个函数和你的函数差不多,就是你的打印语句只输出一次,下面定义了2个变量助于理解!
主要问题 ...

你不是在云5提问了,帮你写出来了,有内存图便以理解
回复 使用道具 举报
楼主你看下面的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技术分 +1 收起 理由
孙百鑫 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
好吧,我的理解不对。
回复 使用道具 举报
应该是每次打印j的值,即0~99
回复 使用道具 举报
突然想起一点问题来,为什么不能重新编辑了呢?
哎,真失败....
  1. public class Test3
  2. {
  3.         public static void main(String[] args)
  4. {
  5.         int j = 0;
  6.        
  7.         for(int i=0;i<100;i++)
  8.         {
  9.                 j++;        //这里的j = j++;相当于每次j被赋值为0;
  10.         }
  11.         System.out.println(j);
  12.        
  13.        
  14. }
  15. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
孙百鑫 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
  1. //答案是:0,关于j++;这种后加的,下面这个小例子可以帮你理解

  2. public class Test3
  3. {
  4.         public static void main(String[] args)
  5. {
  6.         int j = 0;
  7.         int[] buf = new int[5];
  8.         for(int i=0;i<5;i++)
  9.         {
  10.                 buf[i]=j++;
  11.         }
  12.         for(int b : buf)
  13.         {
  14.                 System.out.println(b);
  15.         }
  16.        
  17. }
  18. }

复制代码
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马