java中的运算符:'+';与'=';vs'+=';

java中的运算符:'+';与'=';vs'+=';,java,operators,Java,Operators,我经常使用两种形式:java中加法(也包括减法、乘法等)运算符的长短。我认为这不会影响性能或速度,但我被一些问题弄糊涂了:“为什么java创建者提供了这两种形式的操作符?它们之间的区别是什么?”那么,这两种形式之间的真正区别是什么 int a = 10, b = 3; b = b + a; 及 有人能给我解释一下吗?两种形式之间的差异可能隐藏在较低的级别? 每本书都只说:“Java也有复合运算符…”但没有提到差异。它没有提到任何差异,因为从程序员的角度来看,没有任何差异。 b = c + a;

我经常使用两种形式:java中加法(也包括减法、乘法等)运算符的长短。我认为这不会影响性能或速度,但我被一些问题弄糊涂了:“为什么java创建者提供了这两种形式的操作符?它们之间的区别是什么?”那么,这两种形式之间的真正区别是什么

int a = 10, b = 3;
b = b + a;

有人能给我解释一下吗?两种形式之间的差异可能隐藏在较低的级别?
每本书都只说:“Java也有复合运算符…”但没有提到差异。

它没有提到任何差异,因为从程序员的角度来看,没有任何差异。

b = c + a;
符号的存在是因为它是加法的正常情况。简称

b += a;
存在于特殊情况下,
c
“是”
b
,并真正扩展到

b = b + a;

一个比较短,就是这样。

这两种说法实际上根本没有区别


b+=a
内部将仅被视为
b=b+a

基本上没有区别。
+=
只是为了您的方便。

不同之处在于,在第一种情况下,创建一个临时对象
c=(a+b)
,然后将其分配回
b
。在第二种情况下,操作发生在适当的位置,应该更有效


至少,这在以前的C++中是这样的:现代编译器和JIT会自动检测并优化这一点,因此,实际上根本没有区别。

Add and assignment
operator,它将右操作数与左操作数相加,并将结果赋给左操作数
B+=A
相当于
B=B+A

到目前为止,我只发现逻辑复合运算符有一点不同:

boolean accepted = firstCheck();

version 1: accepted = accepted && secondCheck();
version 2: accepted &= secondCheck();
上述代码的行为将有所不同:

如果accepted为false,则版本1将忽略调用
secondCheck()


版本2将始终调用
secondCheck()

在较低的级别上隐藏它们之间的差异。
b+=a
相当于
b=b+a

然而,这里有一些危险。似乎
b+=a
是一个原子操作,但它首先读取
b
,然后读取
a
,然后求和,然后将结果写入
b
。在处理并发操作时,将其视为原子操作可能会导致错误。换句话说,在并发环境中使用这个较短的
+=
操作符时,请始终记住提供一些显式锁

考虑以下代码:

int x = 9;
short s = 2;
s = s+x; // Compiler error
s += x;  // Compiles 

所以,基本上当你说:
s+=x
时,它的意思是
s=(短)(s+x)
。当您使用
s=s+x
时,编译器会抱怨,因为它无法隐式地将
x
int
转换为
short
。因此,
+=
操作员负责类型转换。

问自己同样问题的另一种方法是,
java.lang.String
和刚才的
String
有什么区别?就源代码的全部内容而言,差异是巨大的:表达性和可读性。

这个问题真的很老了。但我想总结一下:我在 下一个案文:

形式为E1 op=E2的复合赋值表达式是等效的 toE1=(T)((E1)op(E2)),其中TE1的类型,除了E1 仅评估一次


所以,这就足够理解了

“那是因为没有区别。”斯蒂芬潘特说。不,有一个区别。可能重复的注意,例如,如果b是
字节
,a是
整数
<代码>b=b+a不会编译,但
b+=a
将编译,因为它相当于
b=(字节)(b+a)。使用复合运算符时,始终存在隐式强制转换。在这种情况下,
b+=a
相当于
(int)(b+a)和非
b=b+as+=x时,代码>否它确实
s=(短)(s+x)你是不对的!您可以阅读@RahulBobhate发布的第一个答案。
int x = 9;
short s = 2;
s = s+x; // Compiler error
s += x;  // Compiles