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 ba op= b 的含义不同。

请参阅 Peter Lawrey 的回答以获取一个示例。当abyte 并且bint 并且“op”是+ 时。 “陷阱”是a + b 产生一个int,然后不能分配给a ...没有类型转换。

对于ab 的其他类型以及其他算术和位运算符,同样的情况也适用。

【讨论】:

【参考方案3】:
int a = 10;
int b = 20;   
a=a+b; // 30

a+=b; // 30

System.out.println(a);

两者都会给出相同的答案。

【讨论】:

以上是关于Java中a + = b和a = a + b之间的区别[重复]的主要内容,如果未能解决你的问题,请参考以下文章

java,数字,字符,字符串之间的转化

如何用java写ACM的a+b

java中的接口,实现类之间的关系

java中这个符号“=”是啥意思?

如何用java写下Hello,A and B!的那个试题?

java 正则匹配 ,某 首尾中间 多个内容