c=c+a 与 c+=a 的区别

小飞侠Eirc 2014-09-01 01:55:32
本人是新手,在学习java的过程中,发现一个问题,不得其解,请教各位大神
先上问题:
class  Demo
{
public static void main(String[] args)
{
byte a=1;
byte b=3;
byte c=a;
c=c+b;
System.out.println(c);
}
}
/*
编译结果:
---------- JAVAC ----------
Demo.java:8: 错误: 可能损失精度
c=c+b;
^
需要: byte
找到: int
1 个错误
*/


但是如果把代码写成:
class  Demo
{
public static void main(String[] args)
{
byte a=1;
byte b=3;
byte c=a;
c+=b;
System.out.println(c);
}
}
/*
编译结果:
---------- JAVAC ----------
输出完成 (耗时 0 秒) - 正常终止
*/


那么问题就来了, c=c+b 与 c+=b 难道有什么区别吗?结果上是没有区别,但是在编译过程中却有区别,区别在哪呢?
...全文
2167 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
「已注销」 2014-09-07
  • 打赏
  • 举报
回复
引用 18 楼 HinanaiTenshi 的回复:
[quote=引用 14 楼 zhang5476499 的回复:] 一般来说,a += b 的效率要比 a = a + b要高点。
都一样啊,不都是inc或者add么[/quote]在汇编中,inc要比add效率高丫!
「已注销」 2014-09-05
  • 打赏
  • 举报
回复
一般来说,a += b 的效率要比 a = a + b要高点。
**:天下第一 2014-09-05
  • 打赏
  • 举报
回复
+=是复合复值
Vanquish_self 2014-09-05
  • 打赏
  • 举报
回复
涨姿势了 感觉前面几楼都是对的 自己还从来没有想过类似的问题 才知道原来jvm中是没有int以下的运算器的 加法运算符运算过后已经自动转换成了int类型
aaron_gzt 2014-09-05
  • 打赏
  • 举报
回复
c=a+b以及c+=b都是赋值表达式,其中c=a+b是简单赋值,c+=b是复合赋值,java语言规范中,复合赋值E1 op = E2等价于简单赋值E1 = (T)((E1)op(E2)),其中T是E1的数据类型,op为操作符
sui2121 2014-09-05
  • 打赏
  • 举报
回复
这个是一个面试经常问的一个问题 废话不多说了 1、2楼说的是正解
-阿克蒙德- 2014-09-05
  • 打赏
  • 举报
回复
涨姿势
HinanaiTenshi 2014-09-05
  • 打赏
  • 举报
回复
jvm里根本没有int以下的运算器,所有这些运算都是通过i2c、i2b转为int,计算完成后再c2i、b2i的转回来。 也就是说你的等式等同于byte c = 2int + 3int;不做强转必然报错啊,你直接用int+int,然后又要求结果是个byte,jvm当然不认识了。 +=在编译的时候自带类型转换,不需要再手工添加了。
小飞侠Eirc 2014-09-05
  • 打赏
  • 举报
回复
非常感谢各位的回答, 总结一下:
class  Demo1
{
	public static void main(String[] args) 
	{	
		byte b=1;
		/*
		b=b+1的运算过程为:b+1做加法运算,其中加法运算过程是以int类型为基础的,所以最后的结果就是int。
		所以在用=号赋值给b的时候,因为b为byte型,会报错,必须使用强制类型转换 b=(byte)(b+1)
		*/
		b=b+1;
		
	}
}
class  Demo2
{
	public static void main(String[] args) 
	{	
		byte b=1;
		/*
		b+=1的运算过程为:
		1.运算b+1,当然,也是使用int基础运算的,结果也是int
		2.运算求和之后,使用强制类型转换,转换的类型就是b的类型,即byte
		3.将byte类型的结果赋值给b
		*/
		b+=1;
	}
}
另外 long tmp=365 * 24 * 60 * 60 * 1000;是错误的,因为会结果溢出的。原因就是加法运算的过程。 这样就对了 long tmp=365 * 24 * 60 * 60 * 1000l,就是参加运算的随便一个数为long型
HinanaiTenshi 2014-09-05
  • 打赏
  • 举报
回复
引用 14 楼 zhang5476499 的回复:
一般来说,a += b 的效率要比 a = a + b要高点。
都一样啊,不都是inc或者add么
daxiang253 2014-09-05
  • 打赏
  • 举报
回复
涨姿势
yueyuexiong 2014-09-05
  • 打赏
  • 举报
回复
好厉害。。。。。 byte 做运算,可能会产生超出该数据类型的数据。所以在内部加了强转吧。 范围 byte [-128,127]
缘与我无缘 2014-09-05
  • 打赏
  • 举报
回复
涨姿势
俺是小王子 2014-09-04
  • 打赏
  • 举报
回复
20分显然不够分。。。。
chanamper 2014-09-04
  • 打赏
  • 举报
回复
嗯嗯,楼上正解,主要是数据类型转换的原因。
from威仔 2014-09-03
  • 打赏
  • 举报
回复
楼上正解,要先转换为int类型运算的,然后再强转
LOVE-漂泊 2014-09-02
  • 打赏
  • 举报
回复
都是正解!!!!
流氓兔紫雨 2014-09-01
  • 打赏
  • 举报
回复
+=有自动转换的功能 将 int 转换为byte
Conquer0101 2014-09-01
  • 打赏
  • 举报
回复
1、c = c + b ;是做了两个动作,先是加法运算,后是赋值运算。在进行加法运算的时候就已经确定了得到的结果是int类型的,所以不能再往c中存放,这样会报损失精度的错误。 2、而 c+=b;它只做了一个赋值的过程,可以以byte类型来存放的情况下进行自动转换为byte。
lizy_java 2014-09-01
  • 打赏
  • 举报
回复
"+"是逻辑运算符,在做byte之间做运算时,如 c = c+b,c+b的运算结果的数据类型会自动转换为了int类型 想将int类型转换为byte类型,就会报错:只有 c = (byte)(c+b);就不会出错; c += b;这个运算的,数据类型是以 c的数据类型为标准的。所以不需要转换。

62,621

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧