黑马程序员技术交流社区

标题: 当变量a=a++,a不变,b=a++时a却加1问题 [打印本页]

作者: cs8630323    时间: 2014-8-12 19:39
标题: 当变量a=a++,a不变,b=a++时a却加1问题
本帖最后由 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
        }
}
作者: J.twt    时间: 2014-8-12 20:03
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:40
本帖最后由 黎志勇 于 2014-8-12 20:43 编辑

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


作者: cs8630323    时间: 2014-8-12 20:57
黎志勇 发表于 2014-8-12 20:40
左边 = a++;
过程:

请问,你解释的过程,a=a++和b=a++应该一样啊,为什么运行b=a++,a自增,运行a=a++,a却没有自增
作者: 明天2014    时间: 2014-8-12 20:57
呵,我觉得毕老师已经讲得很清楚了。
作者: 明天2014    时间: 2014-8-12 21:01
明天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
a=a++这条式子首先先把右边a的值赋给右边的a,然后再执行后自增运算,这个后自增的运算只作为一个返回值出现,并没有再赋值给a了。
b=a++这条式子就不用说了吧= =
作者: 黎志勇    时间: 2014-8-12 21:04
cs8630323 发表于 2014-8-12 20:57
请问,你解释的过程,a=a++和b=a++应该一样啊,为什么运行b=a++,a自增,运行a=a++,a却没有自增 ...

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

这是java中的特点,换个其他语言来说不一定
作者: ﹑淼    时间: 2014-8-12 21:08
表达式a=a++的运算过程是先将a的指赋予a!即先运行a=a,再自动加1,这里加1只是作为返回值出现,并没有赋给a!
作者: Imp_x    时间: 2014-8-12 21:11
看错题目了= =
b=a++的话,因为是后自增的,所以先把a=10的值赋给b,然后a再做自增运算,即a=a+1=11,此时输出a,a就等于11= =
作者: 忆梦追风    时间: 2014-8-12 22:00
a=a++;这个是先赋值。a在自加1,因为先赋值给自己,所以a不变,b=a++,a先把值赋给b,再自加,所以a就变了
作者: yuli2039    时间: 2014-8-12 22:56
明天2014 发表于 2014-8-12 21:01
我去,还没写完想换行按了个回车就自动发表了。
a=a++;//a先缓存10,然后自增,a=11,最后赋值时是赋的缓 ...

此美女说的对
作者: 柳超    时间: 2014-8-12 23:13
这个问题我特意问过老师:这个是java运行机制的问题。 a=a++;运算的过程是这样的首先,a=a会被令存起来一份,然后运算a++   a自增了后,其他语言这样运算a会自增。但是java最后会把最先存储的的值返回一次赋值给a ,如果是b=a++就不会出问题,但是如果a的话最先存储的值是没自增的,最后赋值就把a自增的值覆盖年掉了
作者: 柠萌不    时间: 2014-8-12 23:16
前面输出10是因为先赋值,所以缓存里a还是10啊...
作者: conglin1991    时间: 2014-8-12 23:22
a=a++  不是a先赋值过去然后自加返回值,b=a++ 因为a=10先给b在运行++ b=11 因为返回值所以a=11是这么理解的么。。
作者: as_heima    时间: 2014-8-12 23:27
首先你的程序里有2次a++,a++,我的理解是,先使用a的值,然后自加,在第二次使用a++的之前a已经变成11了,然后你又把11给了b
作者: M单色调    时间: 2014-8-12 23:51
解答正确。。。
作者: justin1258    时间: 2014-8-13 00:05
第二种结果其实很明显不用解释,我结合字节码给你解释一下第一种情况,下面是,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.
希望我的解释对楼主有帮助,谢谢!


作者: 我行我SHOW‰    时间: 2014-8-13 02:12
柳超 发表于 2014-8-12 23:13
这个问题我特意问过老师:这个是java运行机制的问题。 a=a++;运算的过程是这样的首先,a=a会被令存起来一份 ...

赞同此说话~~~~~




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2