黑马程序员技术交流社区

标题: 【技术探讨】b=b++与b=++b的区别 [打印本页]

作者: 蓝墨清幽    时间: 2015-4-21 14:21
标题: 【技术探讨】b=b++与b=++b的区别
本帖最后由 蓝墨清幽 于 2015-4-21 16:55 编辑

以下代码中再编译过程中都不会出现错误,可是③会出现The assignment to varible b has no effect的警告,而①和②没有警告。③和①、②有什么不同吗???求解!!!
①  byte b = 1; b = b += 1;
②  byte b = 1; b = ++b;
③  byte b = 1; b = b++;④  byte b = 1; b = b + 1;


无标题.png (14.48 KB, 下载次数: 89)

无标题.png

作者: itheima_llt    时间: 2015-4-21 15:43
经验啊... 向楼主学习
作者: itheima_llt    时间: 2015-4-21 16:08
我恨死这个编辑器了,我的格式啊,格式啊!!我去,全给我打乱了!
作者: 蓝墨清幽    时间: 2015-4-21 16:37
那后自增的为么可以,是因为b+1的值没有赋给b,b值仍没有变么?
作者: 蓝墨清幽    时间: 2015-4-21 16:40
itheima_llt 发表于 2015-4-21 16:08
我恨死这个编辑器了,我的格式啊,格式啊!!我去,全给我打乱了!

那后自增的为么可以,是因为b+1的值没有赋给b,b值仍没有变么?
作者: itheima_llt    时间: 2015-4-21 16:42
蓝墨清幽 发表于 2015-4-21 16:37
那后自增的为么可以,是因为b+1的值没有赋给b,b值仍没有变么?

{:3_54:}.....姐姐,你这样回复我是看不到的。。。。你都没回复我。
我要不点你帖子,都没看到。
----------------------------------
后自增b=b++;//这是先做赋值动作b = b;都是byte,当然没问题!
自增完了b再加1。
!注意了,这个时候,b+1也被提升为int类型的了!!
b=b++;
最后这个b还是被提升为int类型的了。
不信,你可以再加一条语句
byte c = b;还是会出现同样的提示:这个赋值语句没有意义!
作者: 蓝墨清幽    时间: 2015-4-21 16:51
本帖最后由 蓝墨清幽 于 2015-4-21 16:54 编辑
itheima_llt 发表于 2015-4-21 16:42
.....姐姐,你这样回复我是看不到的。。。。你都没回复我。
我要不点你帖子,都没看到。
-------- ...

:o嗯嗯谢谢。但是像④  byte b = 1; b = b + 1; 这种强制类型转换都会报错,而③却不会报错只有警告,这是什么情况?
作者: itheima_llt    时间: 2015-4-21 16:59
蓝墨清幽 发表于 2015-4-21 16:51
嗯嗯谢谢。但是像④  byte b = 1; b = b + 1; 这种强制类型转换都会报错,而③却不会报错,这是什么情 ...

原因很简单!
在你写byte b =1;b = b++;的时候,
JAVA 认为是你粗心,所以它帮你做了这件事:b = (byte) b++;
所以eclipse只给出警告,但不标识为错误。
而byte b =1; b= b+;
Java就认为你完全不懂类型转换原理,当然要报错了!
------------------------
这就跟老师改作业一样!
如果老师无法判断你是真的不懂,还是粗心大意。老师就会默认判断你是粗心大意,只给出提示,要你小心!
但是如果老师能一目了然的判断你犯错误了,是不会认为你是粗心大意的,而是直接打×。
-----------------
相信,你应该有过这种体会:
考试的时候,你写个模棱两可的答案,老师给你判√过,而不是判×。
作者: itheima_llt    时间: 2015-4-21 17:05
不客气,助人为快乐之本!
作者: 蓝墨清幽    时间: 2015-4-21 18:14
itheima_llt 发表于 2015-4-21 16:42
.....姐姐,你这样回复我是看不到的。。。。你都没回复我。
我要不点你帖子,都没看到。
-------- ...

byte c=b;没有出现警告啊,话说The assignment to variable b has no effect这句话啥意思啊?什么情况下老是出现它。

捕获.PNG (3.03 KB, 下载次数: 76)

捕获.PNG

作者: itheima_llt    时间: 2015-4-21 18:25
蓝墨清幽 发表于 2015-4-21 18:14
byte c=b;没有出现警告啊,话说The assignment to variable b has no effect这句话啥意思啊?什么情况下 ...

都有黄色的横线了,还不是警告啊!?
那句英文前面我给你翻译过了的。。。。
“这个变量声明无效”
黄色的曲线就是警告,你仔细看看。
当你是粗心犯得错误,JVM能自己校正,就是警告。
JVM不能自己校正,就是错误,就标红线。

作者: itheima_llt    时间: 2015-4-21 19:03
不错,很简洁!!!!
作者: 殃金咒    时间: 2015-4-21 19:57
看了以后感觉长见识了- -
作者: 淇则有岸    时间: 2015-4-21 21:55
好熟悉的java代码,可我还要学c
作者: wangyu    时间: 2015-4-21 22:05
itheima_llt 发表于 2015-4-21 16:59
原因很简单!
在你写byte b =1;b = b++;的时候,
JAVA 认为是你粗心,所以它帮你做了这件事:b = (byte) b ...

为什么运行的结果b是1?
作者: itheima_llt    时间: 2015-4-21 22:11
本帖最后由 itheima_llt 于 2015-4-21 22:15 编辑
itheima_llt 发表于 2015-4-21 19:03
不错,很简洁!!!!

我看错了。
原因是:JVM帮你强转了,b在17语句后经过JVM强转后就变成byte了。
byte c = b;不会有问题的。。。
--------------
别用eclipse了,用Editplus或者Notepad++吧

作者: gc278161209    时间: 2015-4-21 22:14
3一个是赋值。一个是运算
作者: 张乐    时间: 2015-4-21 22:25
itheima_llt 发表于 2015-4-21 22:11
我看错了。
原因是:JVM帮你强转了,b在17语句后经过JVM强转后就变成byte了。
byte c = b;不会有问题的。 ...

这位师哥回答得好详细!长知识了!
作者: itheima_llt    时间: 2015-4-21 22:32
wangyu 发表于 2015-4-21 22:05
为什么运行的结果b是1?

你这个问题问得太好了,可惜我不知道。囧!
暂时看这个图吧。我再好好想想看看

byte.jpg (80.59 KB, 下载次数: 68)

byte.jpg

作者: lai19    时间: 2015-4-21 22:48
同学习了
作者: itheima_llt    时间: 2015-4-21 22:58
wangyu 发表于 2015-4-21 22:05
为什么运行的结果b是1?

http://blog.csdn.net/zhoulenihao/article/details/12404997
你问的这个问题,这个贴里应该能够解答。
他写得好绕,我看几遍看晕了~~~~
我是这样理解的:
b = b++;
因为是先赋值的,所以b=1;
这个时候b++就只上进行数量运算,并没有进行赋值运算。
所以b最终打印结果就是1.
具体实现跟底层的寄存器有关系。
--------------
单独写的b++;
最后是进行了赋值运算,赋值给了b自己的。

作者: cani1see    时间: 2015-4-21 22:58
我来终结前后加的讨论
请看代码

  1. class Demo {
  2.         public static void main(String[] args) {
  3.                 int i = 3;
  4.                 i=i++;
  5.                 /*step1:i+1
  6.                  *step2:return i-1  (3)
  7.                  *step3:  --> i=3
  8.                 */
  9.                 System.out.println("i-->"+i);
  10.                 i=++i; //warning:no effect
  11.                 /*step1:i+1
  12.                  *step2: return i(4)
  13.                  *step3: -->i=4
  14.                 */
  15.                 System.out.println("i-->"+i);
  16.                
  17.                 byte a = 1; a = a += 1;
  18.                 System.out.println("a-->"+a);//a-->2
  19.                 byte b = 1; b = ++b; //warning:no effect
  20.                 System.out.println("b-->"+b);//b-->2
  21.                 byte c = 127; c++;
  22.                 System.out.println("c-->"+c);//c-->-128
  23.                 byte d = 1; d = (byte) (d + 1);
  24.                 System.out.println("d-->"+d);//d-->2
  25.         }

  26. }
复制代码


你把++操作都拆成3步就清楚多了
作者: 龙腾浩少    时间: 2015-4-21 23:02
有些貌似会自动类型提升,哪些还不是很清楚。哈哈受教了
作者: zhoudeheng    时间: 2015-4-22 22:57
byte b = 1;//b是byte类型的 b=++b;//先进行b自增,b+1结果是int类型的。而b是byte类型的。int类型比byte类型高级,不会自动转换。 改一下:b=(byte)++b; 这是向下转型,如果是Byte到int就是向上转型,可以直接转,不需强制转换
作者: zhoudeheng    时间: 2015-4-22 23:00
蓝墨清幽 发表于 2015-4-21 16:40
那后自增的为么可以,是因为b+1的值没有赋给b,b值仍没有变么?

int b=1
int a=b++//a=1,b=2
int a=++b//a=2,b=2
这就是彼此的区别!!!
作者: zhoudeheng    时间: 2015-4-23 16:37
zhoudeheng 发表于 2015-4-22 23:00
int b=1
int a=b++//a=1,b=2
int a=++b//a=2,b=2

你的代码我敲了一遍
byte b=1;
b=b++;//没问题,b=1
b=++b;//没问题,b=2
b+=1;//没问题,b=3,赋值运算,里面有默认的强制转换
b=b+1;//有问题,损失精度,需强制转换
好了,以上是亲自验证的,而且,我们刚刚也学过这些!!!
作者: 严晗哲    时间: 2015-4-23 18:31
原以为是很简单的问题,没想到里面还有那么多原因,学习了!
作者: fanxia_2007    时间: 2015-4-23 18:36
考察的是先赋值还是先运算。
作者: 哔哩哔哩    时间: 2015-4-23 18:55
1、b=++b;会有The assignment to variable b has no effect这样的警告(注意只是警告不是报错),意思是该赋值不会影响b;++b的作用本来就是b的值+1后再赋值给自己,++b就相当于b=b+1;b=++b完全可以写成++b;赋值两次是多此一举,所以编译器会警告你赋值不会影响b的最终值;
2、b=b++;跟上边不一样,按道理说这句代码会先把b的值赋值给b,再自增,但是请注意:这里是先把b的值取出来后放在了临时的内存,然后再等待b自增后再把临时存的那个值赋值给b;http://bbs.itheima.com/thread-188910-1-1.html这里有这句代码详细的解释;
总结:上边两句代码最终b的值不一样,b=b++影响了b的值,所以编译器不会弹出警告;b=++b效果等同于b++,相当于重复赋值,所以编译器认为这是多余的操作,弹出警告,不是报错。

作者: 柒夜    时间: 2015-4-23 18:59
byte b=1;b是byte类型的。b=b++,b先自增,再将值赋给前面,其结果是int类型的,但是前面b是byte类型的,不能自动转换,可以改一下b=(byte)++b
作者: 蓝墨清幽    时间: 2015-4-23 22:15
哔哩哔哩 发表于 2015-4-23 18:55
1、b=++b;会有The assignment to variable b has no effect这样的警告(注意只是警告不是报错),意思是该 ...

透彻了!:handshake这个答案解释得我很满意。
作者: 一个土豆丶    时间: 2015-4-23 22:34
我理解是 前自加  和 后自加
作者: 1017161726    时间: 2015-4-23 22:56
蓝墨清幽 发表于 2015-4-21 16:51
嗯嗯谢谢。但是像④  byte b = 1; b = b + 1; 这种强制类型转换都会报错,而③却不会报错只有警告,这是 ...

这个是Eclipse给的警告。是因为b=b++无意义。左边的值不变。它不像b=++b,左边的b每次会增加一。




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