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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张胜格 中级黑马   /  2012-12-30 14:10  /  2547 人查看  /  15 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 张胜格 于 2012-12-30 14:55 编辑

大家看一下下面的程序结果是什么啊?原因又是什么啊?想了半天没弄明白。
public class Test01 {
        public static void main(String[] args) {
                // TODO Auto-generated method stub
                int j=0;
                int tmp=0;
                int i=0;
                for (;i<100;i++){
                j++;
                tmp=tmp++;
                }
                System.out.println(tmp);
                System.out.println(j);
        }

}

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1

查看全部评分

15 个回复

倒序浏览
首先你这For循环里面就少了一个起始判断条件,看你循环体内定义的是跟 i 有关的变量,这么定义是错误的,因为你在循环体外已经定义这么变量,那么循环体内你就不能这么定义了,改改你的代码把。
改完之后假设你的循环代码体内仍是这个代码,那么最终的结果应该是j=0,tep=99;

点评

请看三楼  发表于 2012-12-30 15:53
回复 使用道具 举报
本帖最后由 dustookk 于 2012-12-30 15:52 编辑

看不下去了....  楼主 你的问题 并没有解决 , 楼下几个同学也都没有意识到这个小小的tmp=tmp++的精髓.

看这么一段代码,你们认为输出是多少?
  1. public class TinyTest {
  2.     public static void main(String[] args) {
  3.         int i = 0;
  4.         i = i++;
  5.         System.out.println(i);
  6.     }
  7. }
复制代码
结果是: 0

但原因肯定不是楼下几位说的"先赋值后自增" ("先赋值后自增"的结果还不是自增) 而是:

让我们先用javap -c命令看看就知道了:
  1. public static void main(java.lang.String[]);
  2. Code:
  3. 0:   iconst_0     //0放到栈顶
  4. 1:   istore_1    //把栈顶的值保存到局部变量1,也就是i中
  5. 2:   iload_1     //把i的值放到栈顶,也就是说此时栈顶的值是0
  6. 3:   iinc    1, 1  //注意这个指令,把局部变量1,也就是i,增加1,这个指令不会导致栈的变化,也就是说局部变量1,即i此时为1了。
  7. 6:   istore_1     //把栈顶的值(0)保存到局部变量1,也就是让i为0了,所以最后i为0
复制代码
不好理解的话 我画了张图:





这个问题提醒我们:

切忌使用 i=i++; 这样的句子

点评

太好了 总结的  发表于 2012-12-30 16:09
这个答案才是我真正想知道的,谢谢啊!  发表于 2012-12-30 16:00

评分

参与人数 3技术分 +2 黑马币 +60 收起 理由
刘芮铭 + 2 很详细
张胜格 + 30 赞一个!
张超 + 30

查看全部评分

回复 使用道具 举报
这是一个简单的for循环,最开始定义并初始化了三个变量i,j,tump。for(;i<100;i++)
这里当i<100时,一直执行大括号里面的内容,且i值每次增加1.
最后System.out.println(j);当程序运行完毕时输出j的值。
System.out.println(tmp);当程序运行完毕时输出tmp的值。
for (;i<100;i++){
                 j++;
                 tmp=tmp++;
                 }

点评

请看三楼  发表于 2012-12-30 15:53
回复 使用道具 举报
  1. package com.heima;

  2. public class Test01 {
  3.     public static void main(String[] args) {
  4.             // TODO Auto-generated method stub
  5.             int j=0;
  6.             int tmp=0;
  7.             int i=0;
  8.             for (;i<100;i++){
  9.             j++;
  10.             tmp=++tmp;
  11.             }
  12.             System.out.println(tmp);
  13.             System.out.println(j);
  14.     }

  15. }
复制代码
这样的话temp的值也是100了,
tmp=tmp++;和tmp=++tmp是不一样的,前者是先计算等号,tem的值始终没变,后者是先++,建议你在将毕老师的视频看下第二天的第九节

点评

请看三楼  发表于 2012-12-30 15:53
回复 使用道具 举报
tmp=tmp++;
++在后,永远都是先赋值给变量,后才自增的。
照你这么写,你每次循环进来,tmp不都是先被赋值成0了吗?内存中储的永远是0,++并没有参与运算。
只要指向tmp就是0。
结果必然是
0
100

点评

请看三楼  发表于 2012-12-30 15:54
回复 使用道具 举报
周亮 中级黑马 2012-12-30 14:45:03
7#
dustookk 发表于 2012-12-30 14:36
tmp = tmp++;   循环一百次 还是0

起始值为1,当i<100的时候符合条件,也就是i要循环99次,所以tem=99

点评

写到记事本里测试一下...tmp最后是不是0  发表于 2012-12-30 14:49
回复 使用道具 举报
刘丰伟 发表于 2012-12-30 14:38
这样的话temp的值也是100了,
tmp=tmp++;和tmp=++tmp是不一样的,前者是先计算等号,tem的值始终没变,后者 ...

哦,明白了,先赋值再自加,所以temp的值没有变化,最后还是0!
回复 使用道具 举报
周亮 中级黑马 2012-12-30 14:50:57
9#
周亮 发表于 2012-12-30 14:45
起始值为1,当i

结果必须不是0,是99,如果你改成tem++,那么结果就是0了
回复 使用道具 举报
周亮 发表于 2012-12-30 14:24
首先你这For循环里面就少了一个起始判断条件,看你循环体内定义的是跟 i 有关的变量,这么定义是错误的,因 ...

j不可能是0吧!另外for循环式可以这样写的。我知道了,我忘记了++temp和temp++的区别了!!
回复 使用道具 举报
周亮 中级黑马 2012-12-30 14:59:22
11#
张胜格 发表于 2012-12-30 14:53
j不可能是0吧!另外for循环式可以这样写的。我知道了,我忘记了++temp和temp++的区别了!! ...

你理解错了一点,循环完成之后,j 也好,tmp也好,结果都是99,不同的地方在于,j没有变量接受,循环完了,对原来的j没影响,而tmp不同,有变量在那里接收着呢,相当于每次循环完,堆内存在tem原来的内存处更改了他的值,这么解释能明白么
回复 使用道具 举报
周亮 发表于 2012-12-30 14:59
你理解错了一点,循环完成之后,j 也好,tmp也好,结果都是99,不同的地方在于,j没有变量接受,循环完了 ...

还是不太明白,怎么是99啊,不是循环了100次吗?执行++运算时内存中是怎样操作的啊?是不是跟什么缓存机制有关啊
回复 使用道具 举报
周亮 中级黑马 2012-12-30 15:29:33
13#
张胜格 发表于 2012-12-30 15:21
还是不太明白,怎么是99啊,不是循环了100次吗?执行++运算时内存中是怎样操作的啊?是不是跟什么缓存机 ...

这个循环次数跟缓存什么的是没关系的,循环次数要看你循环条件了,起始值为1,结束值为99,你说循环了多少次?
至于循环体内两个变量,tem相当于引用数据类型,跟成员变量有相同的地址值,当循环时,成员变量也跟着变化,而那个i跟成员变量是同名的,但是不是同一个变量,就相当于一个局部变量,循环完了,这个变量就消失了,跟成员变量没什么关系
回复 使用道具 举报
张胜格 发表于 2012-12-30 15:21
还是不太明白,怎么是99啊,不是循环了100次吗?执行++运算时内存中是怎样操作的啊?是不是跟什么缓存机 ...

楼主,你的这个小程序 没这么简单,请看三楼详解
回复 使用道具 举报
张超 中级黑马 2012-12-30 16:11:24
15#
dustookk 发表于 2012-12-30 14:36
看不下去了....  楼主 你的问题 并没有解决 , 楼下几个同学也都没有意识到这个小小的tmp=tmp++的精髓.

看 ...

能否加你的qq

我的2625817718
回复 使用道具 举报
清水 中级黑马 2012-12-30 17:31:18
16#
3楼回答得真好,不过说实话有点看不懂,只记住了结论。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马