2

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

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

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

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

4

11 回答 11

8

考虑以下代码:

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

所以,基本上当你说:s += x这意味着s = (short)(s+x). 当你使用时s = s+x,编译器会抱怨,因为它不能隐式转换为x。因此,运算符负责类型转换。intshort+=

于 2013-05-08T10:00:11.810 回答
3

它没有说明差异,因为从程序员的角度来看没有。这

b = c + a;

符号存在是因为它是加法的正常情况。简短的形式

b += a;

存在于c“是”的特殊情况b并真正扩展到

b = b + a;
于 2013-05-08T09:45:17.450 回答
2

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

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

于 2013-05-08T09:45:52.350 回答
1

一个更短,就是这样。

于 2013-05-08T09:45:30.963 回答
0

Add AND assignment运算符,它将右操作数添加到左操作数并将结果分配给左操作数 B += A相当于B = B + A

于 2013-05-08T09:46:21.203 回答
0

这个问题真的很老了。但我想总结一下:我在 Java 语言规范中找到了下一段文字:

E1 op= E2形式的复合赋值表达式等价于E1 = (T) ((E1) op (E2)),其中TE1的类型,除了E1 只计算一次。

所以,理解就够了!

于 2013-06-11T06:31:11.410 回答
0

另一种问自己同样问题的方法是,和 just有什么区别java.lang.StringString?就源代码的意义而言,差异是巨大的:表现力和可读性。

于 2013-05-08T10:02:11.180 回答
0

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

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

于 2013-05-08T09:45:32.820 回答
0

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

于 2013-05-08T09:45:41.983 回答
0

到目前为止,我只发现了与逻辑复合运算符的区别:

boolean accepted = firstCheck();

version 1: accepted = accepted && secondCheck();
version 2: accepted &= secondCheck();

上面的代码会有不同的表现:

secondCheck()如果接受为假,版本 1 将省略调用

版本 2 将始终调用secondCheck()

于 2013-05-08T09:50:37.923 回答
0

它们隐藏在较低级别之间没有区别。 b += a相当于b = b + a。但是,这里有一些危险。这似乎b += a是一个原子操作,但是它首先读取b,然后读取a,然后对它们求和,然后将结果写入b. 将其视为原子操作可能会在处理并发操作时导致错误。换句话说,+=在并发环境中使用这个较短的运算符时,请始终记住提供一些显式锁定。

于 2013-05-08T09:53:16.600 回答