Java中a + = b和a = a + b之间的区别[重复]
Posted
技术标签:
【中文标题】Java中a + = b和a = a + b之间的区别[重复]【英文标题】:Difference between a+=b and a=a+b in Java [duplicate] 【发布时间】:2014-12-05 11:35:17 【问题描述】:有人告诉我 a+=b; 之间存在差异。 a=a+b;根据类型声明,这可能导致其中只有一个是合法的。
有人有这方面的例子吗?
【问题讨论】:
this 可能会帮助你 谢谢!这就是我一直在寻找的,例如将 'a' 声明为字节,将 'b' 声明为 int 将导致 a=a+b 非法而 a+=b 合法。 【参考方案1】:基本没有区别,但有细微差别。
算术赋值运算符执行隐式转换。例如
byte a = 1;
int b = 2;
a += b; // compiles
a = a + b; // doesn't compile as a byte + int = int
a = (byte) (a + b); // compiles as this is the same as +=
更多奇怪的例子。
int a = 5;
a += 1.5f;
// a == 6
char ch = '0'; // (char) 49
ch *= 1.1; // ch = '4';
long l = Integer.MAX_VALUE;
l += 0.0f; // i = (long ) ((long ) l + 0.0f)
// i == Integer.MAX_VALUE + 1L; WTF!?
// l is no longer Integer.MAX_VALUE due to rounding error.
【讨论】:
【参考方案2】:JLS(15.26.2 部分)说:
E1 op= E2 形式的复合赋值表达式等价于 E1 = (T) ((E1) op (E2)),其中 T 是 E1 的类型,除了 E1 只计算一次。
类型转换的存在意味着有几个极端情况,其中a = a op b
与a op= b
的含义不同。
请参阅 Peter Lawrey 的回答以获取一个示例。当a
是byte
并且b
是int
并且“op”是+
时。 “陷阱”是a + b
产生一个int
,然后不能分配给a
...没有类型转换。
对于a
和b
的其他类型以及其他算术和位运算符,同样的情况也适用。
【讨论】:
【参考方案3】:int a = 10;
int b = 20;
a=a+b; // 30
a+=b; // 30
System.out.println(a);
两者都会给出相同的答案。
【讨论】:
以上是关于Java中a + = b和a = a + b之间的区别[重复]的主要内容,如果未能解决你的问题,请参考以下文章