# 复合赋值运算符[i + = j]与 Java 中的[i = i + j]不同

> 原文： [https://howtodoinjava.com/puzzles/compound-assignment-operator-i-j-is-not-same-as-i-i-j-in-java/](https://howtodoinjava.com/puzzles/compound-assignment-operator-i-j-is-not-same-as-i-i-j-in-java/)

在我们的日常编程中，我们都使用过`i += j`和`i = i + j`之类的语法。 乍一看，它们看起来很相似。 实际上，在实际情况下，几乎所有情况下它们都将产生相同的输出。 但是，令您惊讶的是**它们并不相似**。 在运行时，当 i 和 j 属于不同类型时，它们将得到不同对待**。 让我们看下面的例子：**

```java
int i = 5;

double d1 = (double)i + 4.5; //necessary to satisfy compiler
i += 4.5;

System.out.println(i);
System.out.println(d1);

Output:

9
9.5

```

奇怪的。 是不是 两者都期望相同，因为操作相同。 为什么它们具有不同的价值？ 让我们找出答案。

## 原因

[Java 语言规范](https://docs.oracle.com/javase/tutorial/java/nutsandbolts/op1.html "jlsr")指出：

形式为`E1 op= E2`的复合赋值表达式与`E1 = (T)((E1) op (E2))`，**等效，其中 T 为 E1** 的类型，不同之处在于 E1 仅被求值一次。

因此，可以有效地将我们的原始示例代码重写如下：

```java
int i = 5;

double d1 = (double) i + 4.5;    
i = (int)(i + 4.5); 		//Result converted to int

System.out.println(i);
System.out.println(d1);

Output:

9
9.5

```

因此，**值 9 只是从双精度到整数转换时精度**丢失的结果。

## 学过的知识

始终非常小心地使用复合赋值运算符[i + = j]。 仅在处理类似数据类型时才应使用。 在不同的数据类型中，结果可能不正确。

**祝您学习愉快！**

**参考**

[http://stackoverflow.com/questions/8710619/java-operator](https://stackoverflow.com/questions/8710619/java-operator)
[http://docs.oracle.com/javase/specs/jls/se5.0/html/expressions .html#15.26.2](https://docs.oracle.com/javase/tutorial/java/nutsandbolts/op1.html)