2014-10-10 101 views
1

我被告知a + = b;和a = a + b;这可能导致其中只有一个是合法的,取决于类型的删减。Java中a + = b和a = a + b的区别

有没有人有这样的例子?

+0

[this](http://stackoverflow.com/questions/19957085/why-are-arithmetic-assignment-operators-more-efficient)可能会帮助你 – 2014-10-10 10:17:57

+0

谢谢!这就是我正在寻找的东西,例如将'a'声明为byte,将'b'声明为int将导致a = a + b是非法的,并且a + b是合法的。 – mmgro27 2014-10-10 10:25:06

回答

6

基本上没有什么区别,但是还是有细微差别的。

算术赋值运算符执行隐式转换。例如

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. 
-1
int a = 10; 
int b = 20; 
a=a+b; // 30 

a+=b; // 30 

System.out.println(a); 

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

1

的JLS(部分15.26.2)表示:

形式E1 OP的化合物赋值表达式= E2相当于E1 =(T)((E1)OP(E2)),其中T是E1的类型,除了E1仅评估一次。

类型转换的存在意味着存在几个边缘情况,其中a = a op b意味着与a op= b不同。

请参阅Peter Lawrey的答案举一个例子。当abytebint而“op”是+。 “gotcha”是a + b产生一个int,然后不能被分配到a ...没有类型转换。

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

相关问题