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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李泽霖 黑马帝   /  2012-2-7 15:10  /  2023 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

今天在网上看的:
int j=0;
for(int i=0;i<100;i++)
{
j=j++;
}
System.out.println(j);
输出的竟然是0,求高手们解释一下

9 个回复

倒序浏览
int j=0;
for(int i=0;i<100;i++)
{
j=j++;
}
System.out.println(j);
这个最后的输出就是0,很正确。看来你没有认识请局部变量的作用范围。
在类的定义中存在很多变量例如
class A{
     成员变量;//这个变量作用范围最大
     成员方法(){
          方法内变量;}//方法中的变量仅作用于方法内部
          循环语句{
              语句内部变量//在语句内定义了新变量但是使用完成后就从内存中消失
                                  //如果引用了方法内变量就仅仅作用这段代码,离开该段代码后就恢复到原来值。
         }
    }
}
回复 使用道具 举报
本帖最后由 唐秀启 于 2012-2-7 17:56 编辑

j=j++;
j++赋值给j的值是原先的j的值,所以j=0,不管怎么循环一直在重复这个过程
回复 使用道具 举报
本帖最后由 杨扬 于 2012-2-7 16:05 编辑

{:soso_e140:}你要了解 j=j++的运行顺序...

这表示的是先赋值,后运算..右边j++的值是0.把他赋给左边的 j 后.右边才进行自增.

所以输出是0...

你换成 j=++j   又是另一种结果.


或者你用另一个变量来存储,效果也是不一样的..



int j=0;
int temp=0;
for(int i=0;i<100;i++)
{
temp=j++;
}
System.out.println(temp);


temp在第一次循环的时候拿到的是0,第二次循环才拿到1.最终结果为9

如果把temp换成++j..第一次循环temp拿到的是1.结果为10...

评分

参与人数 1技术分 +1 收起 理由
唐秀启 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
对于:j = j++;
分析:
根据运算符优先级,应先++,再=(赋值);
所以,先是j++,然后j=1,接着再将(j++)表达式的值(为j的初始值)赋给j,则最后,j还是等于0

评分

参与人数 1技术分 +1 收起 理由
唐秀启 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 彭沛东 于 2012-2-7 16:08 编辑

    这应该属于内存问题,首先lz的int j = 0属于成员变量(成员变量与局部变量的作用范围:成员变量作用于整个类中。局部变量作用于函数或者语句中)、而j=j+1只属于局部变量,循环一次j值就在内存中属于垃圾(等于没用)了。
回复 使用道具 举报
主要就是一个赋值,然后还有一个j++和++j有所不同,j++先用j的值,然后j自增,而
++j是j先自增然后在用其值,所以在for循环中,j=j++每次都把0赋值给了j,自然输出
的结果就是0了。
回复 使用道具 举报
成果 黑马帝 2012-2-7 16:15:44
8#
你这不是相当于执行100次j=0么。。当然输出为0。原因是j=j++。。这个++在J的后面。还没有给J增加值。一直这样。而++J就不同了。
回复 使用道具 举报
本帖最后由 尹旗龙 于 2012-2-7 16:46 编辑

这个题涉及到了运算符优先级
当执行j=j++;时由于++运算符优先于=运算符,所以这个语句相当于j=(j++);运算过程是:
int temp=j;
j=j+1;
j=temp;
所以每次赋值j都是0
回复 使用道具 举报
在循环内部,因为j++是先赋值再运算,每次实际上都是给j赋值为0,当然结果是0了,归根到底还是++j和j++的问题。一个先运算再使用,例外一个则相反。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马