多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
# 复合赋值运算符`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)