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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 蓝墨清幽 于 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, 下载次数: 40)

无标题.png

评分

参与人数 1技术分 +1 收起 理由
lwj123 + 1

查看全部评分

41 个回复

正序浏览
蓝墨清幽 发表于 2015-4-21 16:51
嗯嗯谢谢。但是像④  byte b = 1; b = b + 1; 这种强制类型转换都会报错,而③却不会报错只有警告,这是 ...

这个是Eclipse给的警告。是因为b=b++无意义。左边的值不变。它不像b=++b,左边的b每次会增加一。
回复 使用道具 举报
我理解是 前自加  和 后自加
回复 使用道具 举报
哔哩哔哩 发表于 2015-4-23 18:55
1、b=++b;会有The assignment to variable b has no effect这样的警告(注意只是警告不是报错),意思是该 ...

透彻了!:handshake这个答案解释得我很满意。
回复 使用道具 举报
byte b=1;b是byte类型的。b=b++,b先自增,再将值赋给前面,其结果是int类型的,但是前面b是byte类型的,不能自动转换,可以改一下b=(byte)++b
回复 使用道具 举报
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++,相当于重复赋值,所以编译器认为这是多余的操作,弹出警告,不是报错。
回复 使用道具 举报
考察的是先赋值还是先运算。
回复 使用道具 举报
原以为是很简单的问题,没想到里面还有那么多原因,学习了!
回复 使用道具 举报
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-21 16:40
那后自增的为么可以,是因为b+1的值没有赋给b,b值仍没有变么?

int b=1
int a=b++//a=1,b=2
int a=++b//a=2,b=2
这就是彼此的区别!!!
回复 使用道具 举报
byte b = 1;//b是byte类型的 b=++b;//先进行b自增,b+1结果是int类型的。而b是byte类型的。int类型比byte类型高级,不会自动转换。 改一下:b=(byte)++b; 这是向下转型,如果是Byte到int就是向上转型,可以直接转,不需强制转换

点评

我是说③  发表于 2015-4-23 10:36
这么说④是错的咯?_?  发表于 2015-4-23 10:23
回复 使用道具 举报
有些貌似会自动类型提升,哪些还不是很清楚。哈哈受教了
回复 使用道具 举报
我来终结前后加的讨论
请看代码

  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步就清楚多了
回复 使用道具 举报
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自己的。
回复 使用道具 举报
lai19 中级黑马 2015-4-21 22:48:32
20#
同学习了
回复 使用道具 举报
wangyu 发表于 2015-4-21 22:05
为什么运行的结果b是1?

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

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

byte.jpg
回复 使用道具 举报
itheima_llt 发表于 2015-4-21 22:11
我看错了。
原因是:JVM帮你强转了,b在17语句后经过JVM强转后就变成byte了。
byte c = b;不会有问题的。 ...

这位师哥回答得好详细!长知识了!
回复 使用道具 举报
3一个是赋值。一个是运算
回复 使用道具 举报
本帖最后由 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++吧
回复 使用道具 举报
itheima_llt 发表于 2015-4-21 16:59
原因很简单!
在你写byte b =1;b = b++;的时候,
JAVA 认为是你粗心,所以它帮你做了这件事:b = (byte) b ...

为什么运行的结果b是1?
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马