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

© 申绪胜 黑马帝   /  2011-12-19 09:31  /  5959 人查看  /  24 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

public class Test
{       
        public static void main(String [] args)
        {

                int j = 0;
                for (int i = 0; i < 100; i++)
                {
                        j = j++;
                }
                System.out.println(j);
        }       
}
求高人指点一下 为什么结果是0
虽然是把j的本身赋值给自己,但是j还得自加1啊

24 个回复

正序浏览
大梅 黑马帝 2011-12-21 19:51:58
25#
每次赋的值都是自加之前的值也就是0,自加后得到的值变了,所以分配到的内存也不一样了,所以++进行在了原来的0上,一次循环下去。属于内存泄露吧,应该是
回复 使用道具 举报
首先j = j++ 是会先赋值再自加,这也是问题的关键所在,你的j初始值为0,所以第一次循环后j = j++代码执行的结果是j 的值还是等零,依次类推你每次都把0赋给了j。这样即使你循环无数次j还是0
回复 使用道具 举报
陈帅雷 黑马帝 2011-12-21 13:18:53
23#
这多热心人,回复的挺详细的,{:soso_e100:}
回复 使用道具 举报
李栋 金牌黑马 2011-12-21 03:19:56
22#
付旭 发表于 2011-12-20 21:56
为啥加个public 文件名就要保持一致呢?  不加就可以随意呢?

其实吧,这个问题就如同是为什么要写class定义类名是一个道理的,因为这个没有什么原因的呀,以后您只要看是否能用java运行,能的以后就那样做,不能就不那样做,如果一定要问为什么的话,那我估计会浪费很长时间并且根本找不到答案,同时也会对编程失去信心的:handshake
回复 使用道具 举报
付旭 黑马帝 2011-12-20 21:56:15
21#
李栋 发表于 2011-12-20 20:35
class之前加个public的话,是需要用那个类名命名文件名的,比如public class OkoO    那么命名就只能是Ok ...

为啥加个public 文件名就要保持一致呢?  不加就可以随意呢?
回复 使用道具 举报
李栋 金牌黑马 2011-12-20 20:35:52
20#
付旭 发表于 2011-12-20 17:22
是啊 ...  为啥呢?

class之前加个public的话,是需要用那个类名命名文件名的,比如public class OkoO    那么命名就只能是OkoO    不能是Okoo    也就是OkoO.java    但是如果没有public    直接是class OkoO的话,那么就可以把文件名命名为okoo或者一切其他符合规范的名字,比如josdfijoej.java也可以。
回复 使用道具 举报
武超 黑马帝 2011-12-20 18:04:52
19#
这是一个赋值的问题,如果是x=j++你可能就知道了,这里是将x赋值为0之后将j加1;而j=j++就是将j赋值为0;然后再将j加1,j++;是执行的是变量的值,相当于j=j+1,并且将刚刚的J赋值给了它。因此j一直就是0;
改成j=j+1;或j++;都可正确运行
回复 使用道具 举报
付旭 黑马帝 2011-12-20 17:22:01
18#
李栋 发表于 2011-12-20 15:51
付旭同学,您看一下是不是class之前的public取消了

   是啊 ...  为啥呢?
回复 使用道具 举报
李栋 金牌黑马 2011-12-20 15:52:34
17#
我对这个为0的结果的解释完全看不懂啊······不知道毕老师视频中是否能够讲到啊
回复 使用道具 举报
李栋 金牌黑马 2011-12-20 15:51:57
16#
付旭 发表于 2011-12-20 13:14
为啥我复制代码  运行报错...  但是取消开头的public 就不报错了  为啥呢??? ...

付旭同学,您看一下是不是class之前的public取消了
回复 使用道具 举报
付旭 黑马帝 2011-12-20 13:14:35
15#
  为啥我复制代码  运行报错...  但是取消开头的public 就不报错了  为啥呢???
回复 使用道具 举报
荣凯旋 黑马帝 2011-12-20 09:47:57
14#
楼主~我只是怀疑哥们你的技术分杂刷上去的~告诉我下白~{:soso_e110:}
回复 使用道具 举报
j=j++;这条语句的意思是先赋值后,j=0;
然后,右边的j再加1  所以后加的值不会赋给J,for循环执行了一次j=0,j++就被内存释放了,所以不论执行多少次结果都是0。
回复 使用道具 举报
唐林渊 黑马帝 2011-12-20 08:58:16
12#
哥们,一看都知道你没有仔细听毕老师的讲课,毕老师强调很多次,还举例说明了这样的问题       J=J++,先出去吃饭了,没有加1.   J=++J先吃饭后出去玩的。。。这个比喻有意思
回复 使用道具 举报
房宝彬 黑马帝 2011-12-19 22:51:49
11#
本帖最后由 房宝彬 于 2011-12-19 22:52 编辑

你这么理解就OK了

也不用上面说的那么复杂

首先 for循环表达式成立然后往下进行    j = j++;

进行这里的时候,是将 =号右边的  J   赋值=号左边的  j , 然后在将=号右边的 J 加1

这样就是不断的把 =号右边的“J”赋值给=号左边的“j”           懂了吧!

评分

参与人数 1技术分 +1 收起 理由
吴上储 + 1

查看全部评分

回复 使用道具 举报
颜宗茂 黑马帝 2011-12-19 16:22:03
10#
其实自增运算符谁先赋值和谁先自增很容易搞混,也就是运算符优先等级问题。j=j++;意思是:语句右边的j先赋值给左边的j然后自增1,但是j的值不变,还是原来初始化的值0;如果语句是:j=++j;意思是:语句右边的j先自增1然后再赋值给左边的j,这样左边j 的值会重新赋给j,这样在for循环语句中循环而自增。

评分

参与人数 1技术分 +1 收起 理由
吴上储 + 1

查看全部评分

回复 使用道具 举报
j=j++;这条语句的意思是先赋值后++所以后加的值不会赋给J,这是运算符优先级造成的,j=j++和 j=j;j=j+1;是不一样的!

评分

参与人数 1技术分 +1 收起 理由
吴上储 + 1

查看全部评分

回复 使用道具 举报
郭繁森 黑马帝 2011-12-19 11:50:25
8#
                for (int i = 0; i < 100; i++)  //  i=0满足i<100,所以执行for内的执行语句
                {
                        j = j++;                //只是执行J++的动作,j=j+1,执行完,执行i++,再判断 i与100的大小,然后再执行  j++(先把j赋给j再自加)。可改为++j。
                }
                System.out.println(j);
}
楼上的各位已经讲了,应该能明白了吧

评分

参与人数 1技术分 +1 收起 理由
吴上储 + 1

查看全部评分

回复 使用道具 举报
梁俊 黑马帝 2011-12-19 11:15:49
7#
好难懂啊
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马