黑马程序员技术交流社区

标题: 请问b=b++;的值为什么是没有变化的 [打印本页]

作者: 默默地回忆    时间: 2015-1-19 22:27
标题: 请问b=b++;的值为什么是没有变化的
本帖最后由 默默地回忆 于 2015-1-20 22:25 编辑

今天学习了运算符,如果是不同的变量比如byte b=2;byte a=b++;知道a等于b的原值2,b本身加1等于3,但是用b=b++;后,b还是原值2,没变化为3,请问这个是什么原理?
作者: Never、saydie    时间: 2015-1-19 22:29
这个你可以自己敲出来比较一下
作者: Quasimodo    时间: 2015-1-19 22:33
java语言的问题 这个应该属于特例  如果你用C来做就是3了
作者: 默默地回忆    时间: 2015-1-19 22:37
我已经敲了,就是知道结果,不知道原理
作者: syfsyf1993    时间: 2015-1-19 22:37
你要看好哪个先运行哪个后运行,++b 则是你说的那种情况
作者: 丶人世百态    时间: 2015-1-19 22:41
话说运算的时候不会转成int么
作者: _kirito    时间: 2015-1-19 22:50
a=b++;的意思就相当于 a=(byte)(b+1);
b++就是将b自增1然后赋给a,b仍为2,a为3

作者: 碎流    时间: 2015-1-19 22:58
本帖最后由 碎流 于 2015-1-20 00:06 编辑

b = b++; 这也是java中比较难以理解的地方了.这里的 b先赋值给了b,但是b ++ 之后由于没有运算了,这个++并没有产生结果.int b=1;
                 b=b ++;  //这里结果是2.因为赋值给了自己,自己的值已经定了,++就没有效果.(难点)
                 //相当于魔兽里,自己都给自己顶了一个无敌,别人还能影响我吗?
                 System.out.println("b = " + b);
                 int a =  b ++;  //由于之前的 b ++中++ 没有效果,因此,这个a还是1
                 int c =  b ++;  //这里的b已经++ 过了,然后赋值给c,所以,c是2,然后再b ++;
                System.out.println("a = " + a);
                System.out.println("b = " + b);
                System.out.println("c = " + c);


作者: 朋好友    时间: 2015-1-19 22:59
1先计算表达式  b=b;然后b++; b++直接赋值给b  ,最后再完成表达式  b=b的赋值,
作者: 朋好友    时间: 2015-1-19 23:05
朋好友 发表于 2015-1-19 22:59
1先计算表达式  b=b;然后b++; b++直接赋值给b  ,最后再完成表达式  b=b的赋值,

int b=2,b1;
                b=b++;

                //相当于
                //b=b;
                b1 = b;
                System.out.println(b);
                b++;
                b = b1;
                System.out.println(b);



算是猜测?
作者: d7142947    时间: 2015-1-19 23:06
=比++的优先级高  参与运算的时候会先把b的值赋给a,所以a得到的是b自增之前的2.   然后b在自增一,b就变成了3

作者: d7142947    时间: 2015-1-19 23:07
d7142947 发表于 2015-1-19 23:06
=比++的优先级高  参与运算的时候会先把b的值赋给a,所以a得到的是b自增之前的2.   然后b在自增一,b就变成 ...

b = b++;同理
作者: '丫头片子'    时间: 2015-1-19 23:25
学习了。。。。。。。。。。。。。。。
作者: syz1993    时间: 2015-1-20 09:14
加号在后是先赋值再运算,在前面是先运算再赋值
作者: 邓士林    时间: 2015-1-20 10:54
这是由于jvm在做运算导致的,我曾经对此问题进行过答复,个人觉得还行,有空整理下,看帖子吧!
作者: yang_zhi_xiang    时间: 2015-1-20 11:07
额,以前还没休息
作者: 老外    时间: 2015-1-20 12:00
我自己打的例子,上下两个b的值一个是2,一个是3 A的值为2;这个说明,b++,b并没有做自增运算,而是直接将b的值保留了下来,所以a的仍是2;  ++b则是先将B自增然后在赋值给了B,所以b的值为3;
希望能帮楼主解决问题!
             int a ;
                int b = 2;
                b = b++;
                a = b;
                System.out.println(b);
                System.out.println(a);
                b = ++b;
                System.out.println(b);
作者: fanshuai    时间: 2015-1-20 12:14
_kirito 发表于 2015-1-19 22:50
a=b++;的意思就相当于 a=(byte)(b+1);
b++就是将b自增1然后赋给a,b仍为2,a为3
...

++b是先自增再赋值。
b++是先赋值再自增。
作者: fanshuai    时间: 2015-1-20 12:43
本帖最后由 fanshuai 于 2015-1-20 12:47 编辑

你要是非写成b=b++;
因为这条语句的执行顺序是先赋值再自增。
所以现将b原有的值赋给b,然后b+1
b+1之后就没有赋值过程。

你可以试一下:
byte a=2;
a=a++;
byte b=a;
System.out.println("a="+a+",b="+b);
结果a和b都是2
因为a=a++;先赋值再+1,+1并没有赋值,所以a的值一直是2

其实:
b=b++;没意义。
b++本身是先赋值再自增。
你写b=b++;显然是要先将b的值赋给b再让b自增。
而将b的值赋给b没意义,没人这样写。
一般写c=b++;是要先用c将b原来的值记录下来,再让b自增。
把c=b++;其实是两条语句的简写:c=b;  b=b+1;



作者: 传慈    时间: 2015-1-20 12:53
本帖最后由 传慈 于 2015-1-20 19:47 编辑

分成三步
1,int temp=b;
2,  b++;
3,  b=temp;

无标题.png (5.21 KB, 下载次数: 45)

无标题.png

作者: cuixinfu    时间: 2015-1-20 18:41
加号在后:先赋值在递增、
加号在前:先递增在赋值
作者: 默默地回忆    时间: 2015-1-20 22:24
谢谢大家,今天看到了http://bbs.itheima.com/thread-150332-1-1.html 许老师的笔记,其中有这样一句话“当执行b = a++;语句时,先把a放在一个临时内存空间中,然后将a自加1,再将临时内存空间中的a赋值给b”。我是这样理解的,当执行到b=b++;的时候,系统会先把b的值2存储到一个临时内存空间,然后因为赋值的优先级是最低的,++的优先级会高于赋值运算符,所以b会自增1,变为3,然后在运行赋值,因为是b++在b后面,所以把临时内存空间的2赋值给b,所以造成了b的值没有变化。
作者: outsider1020    时间: 2015-1-21 10:31
学习一下。。。。。
作者: 梁小刀11    时间: 2015-1-21 21:47
a=b++;
b++是b的自增运算,++放在后面,表示先赋值,后自增.
所以是a=b,然后b+1.




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