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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© cs8630323 高级黑马   /  2014-8-12 19:39  /  3917 人查看  /  24 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 cs8630323 于 2014-8-12 21:17 编辑

class aaa
{
        public static void main(String[] args)
        {
                int a=10;
                a=a++;
                System.out.println(a);  //a为10
               
                int b=10;
                 b=a++;
                System.out.println(a);//a为什么为11
        }
}

评分

参与人数 1技术分 +1 收起 理由
格子、 + 1 淡定

查看全部评分

24 个回复

倒序浏览
class aaa
{
        public static void main(String[] args)
        {
                int a=10;// a的初始值为10
                a=a++;// a++是一个自增表达式,规则是先将a的值赋值给左值,然后在自增1
                System.out.println(a);  // 所以这里输出10
               
                int b=10;// b的初始值为10
                 b=a++;// 当执行b = a++之后,b的值为11,然后a再次自增,如果打印a的话就是11
                System.out.println(a);//a为什么为11
        }
}
自增运算符:
int a = 3;
int b = a++;// 先将a的值赋值给b,然后再进行自增运算,所以b = 3;
int c = ++a;// 先将a的值进行自增运算,然后再赋值给c,所以c = 5;

点评

这个问题主要是看运算的优先级  发表于 2014-8-12 20:57
还是没说明白,b的值还是10不是11  发表于 2014-8-12 20:31

评分

参与人数 1技术分 +1 收起 理由
格子、 + 1 淡定

查看全部评分

回复 使用道具 举报
本帖最后由 黎志勇 于 2014-8-12 20:43 编辑

左边 = a++;
过程:
  1. int temp = a;
  2. a = a + 1;
  3. 左边 = temp;
复制代码

评分

参与人数 1技术分 +1 收起 理由
格子、 + 1 你懂得

查看全部评分

回复 使用道具 举报
黎志勇 发表于 2014-8-12 20:40
左边 = a++;
过程:

请问,你解释的过程,a=a++和b=a++应该一样啊,为什么运行b=a++,a自增,运行a=a++,a却没有自增
回复 使用道具 举报
呵,我觉得毕老师已经讲得很清楚了。
回复 使用道具 举报
明天2014 发表于 2014-8-12 20:57
呵,我觉得毕老师已经讲得很清楚了。

我去,还没写完想换行按了个回车就自动发表了。
a=a++;//a先缓存10,然后自增,a=11,最后赋值时是赋的缓存的值又把a的值改为10。
b=a++;//a自增后等于11,没有最后重新赋值的过程。
回复 使用道具 举报
Imp_x 高级黑马 2014-8-12 21:04:36
7#
a=a++这条式子首先先把右边a的值赋给右边的a,然后再执行后自增运算,这个后自增的运算只作为一个返回值出现,并没有再赋值给a了。
b=a++这条式子就不用说了吧= =
回复 使用道具 举报
cs8630323 发表于 2014-8-12 20:57
请问,你解释的过程,a=a++和b=a++应该一样啊,为什么运行b=a++,a自增,运行a=a++,a却没有自增 ...

你确定一样?你把a,b代进去看看。你两个打印语句都是打印a吧。
回复 使用道具 举报
张星 中级黑马 2014-8-12 21:06:49
9#
小伙伴们回答的不错!
回复 使用道具 举报
明天2014 发表于 2014-8-12 21:01
我去,还没写完想换行按了个回车就自动发表了。
a=a++;//a先缓存10,然后自增,a=11,最后赋值时是赋的缓 ...

这是java中的特点,换个其他语言来说不一定

点评

嗯,我运行了下,c和c++里面要是这样写,a的值就都是11,不会出现这种现象  发表于 2014-8-13 19:55
回复 使用道具 举报
表达式a=a++的运算过程是先将a的指赋予a!即先运行a=a,再自动加1,这里加1只是作为返回值出现,并没有赋给a!
回复 使用道具 举报
Imp_x 高级黑马 2014-8-12 21:11:28
12#
看错题目了= =
b=a++的话,因为是后自增的,所以先把a=10的值赋给b,然后a再做自增运算,即a=a+1=11,此时输出a,a就等于11= =
回复 使用道具 举报
a=a++;这个是先赋值。a在自加1,因为先赋值给自己,所以a不变,b=a++,a先把值赋给b,再自加,所以a就变了
回复 使用道具 举报
明天2014 发表于 2014-8-12 21:01
我去,还没写完想换行按了个回车就自动发表了。
a=a++;//a先缓存10,然后自增,a=11,最后赋值时是赋的缓 ...

此美女说的对

点评

汗。。。大姐,我的性别没有填错啊。。。哥是男的。。。头像是个美女而已。。。  发表于 2014-8-13 19:58
回复 使用道具 举报
这个问题我特意问过老师:这个是java运行机制的问题。 a=a++;运算的过程是这样的首先,a=a会被令存起来一份,然后运算a++   a自增了后,其他语言这样运算a会自增。但是java最后会把最先存储的的值返回一次赋值给a ,如果是b=a++就不会出问题,但是如果a的话最先存储的值是没自增的,最后赋值就把a自增的值覆盖年掉了

评分

参与人数 1技术分 +1 收起 理由
格子、 + 1 赞一个!

查看全部评分

回复 使用道具 举报 1 0
前面输出10是因为先赋值,所以缓存里a还是10啊...
回复 使用道具 举报
a=a++  不是a先赋值过去然后自加返回值,b=a++ 因为a=10先给b在运行++ b=11 因为返回值所以a=11是这么理解的么。。
回复 使用道具 举报
首先你的程序里有2次a++,a++,我的理解是,先使用a的值,然后自加,在第二次使用a++的之前a已经变成11了,然后你又把11给了b
回复 使用道具 举报
M单色调 来自手机 中级黑马 2014-8-12 23:51:10
19#
解答正确。。。
回复 使用道具 举报
第二种结果其实很明显不用解释,我结合字节码给你解释一下第一种情况,下面是,a=10;a=a++;编译后的字节码:

其中的几个指令用图解释一下(图片是网上找的):


从操作数栈中弹出一个int型的操作数(即常量0),然后将其放置在局部变量1号位置(0号位置已被this占据)




所以可以解释上面的字节码了:
第0,1行合起来就代表将10赋给第二个方法局部变量a;
第3行代表取得a(方法第二个局部变量)的值(此时为10),放入操作数栈;
第4行代表(第二个局部变量)a自增,由10变为11;
第5行代表从操作数栈中弹出一个数(即第3行弹入的10),放到(第二个局部变量)a
所以从代码角度来解释a的最终结果就是10。

上面结合字节码来解释是为了更有说服力,但是比较难理解。但是光从源代码来理解也很好理解,关键在于弄清楚=和++两个操作符的优先级。
在执行a=a++;的时候,首先要计算等号右边的值,用来最后赋给a,由于++是后增,所以取得的值是10。
接着就是执行++操作,因为++的优先级比=高,执行完这步之后其实a的值变为了11,
但是关键在于最后=操作符的执行,他将刚开始计算出来的右边的值10右赋给了a,所以a现在又变成了10。

最后的最后,操作符的优先级很重要,如果=的优先级比++高,那么上面的结果将是先赋值,再自增,a的结果将是11.
希望我的解释对楼主有帮助,谢谢!

评分

参与人数 1技术分 +1 收起 理由
格子、 + 1 赞一个!

查看全部评分

回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马