java中的运算符:'+';与'=';vs'+=';
我经常使用两种形式:java中加法(也包括减法、乘法等)运算符的长短。我认为这不会影响性能或速度,但我被一些问题弄糊涂了:“为什么java创建者提供了这两种形式的操作符?它们之间的区别是什么?”那么,这两种形式之间的真正区别是什么java中的运算符:'+';与'=';vs'+=';,java,operators,Java,Operators,我经常使用两种形式:java中加法(也包括减法、乘法等)运算符的长短。我认为这不会影响性能或速度,但我被一些问题弄糊涂了:“为什么java创建者提供了这两种形式的操作符?它们之间的区别是什么?”那么,这两种形式之间的真正区别是什么 int a = 10, b = 3; b = b + a; 及 有人能给我解释一下吗?两种形式之间的差异可能隐藏在较低的级别? 每本书都只说:“Java也有复合运算符…”但没有提到差异。它没有提到任何差异,因为从程序员的角度来看,没有任何差异。 b = c + a;
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)),其中T是E1的类型,除了E1
仅评估一次
所以,这就足够理解了 “那是因为没有区别。”斯蒂芬潘特说。不,有一个区别。可能重复的注意,例如,如果b是
字节
,a是整数
<代码>b=b+a代码>不会编译,但b+=a
将编译,因为它相当于b=(字节)(b+a)代码>。使用复合运算符时,始终存在隐式强制转换。在这种情况下,b+=a
相当于(int)(b+a)代码>和非b=b+a当您执行s+=x时,代码>否代码>它确实s=(短)(s+x)代码>你是不对的!您可以阅读@RahulBobhate发布的第一个答案。
int x = 9;
short s = 2;
s = s+x; // Compiler error
s += x; // Compiles