原文: 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属于不同类型时,它们将得到不同对待。 让我们看下面的例子:
int i = 5;double d1 = (double)i + 4.5; //necessary to satisfy compileri += 4.5;System.out.println(i);System.out.println(d1);Output:99.5
奇怪的。 是不是 两者都期望相同,因为操作相同。 为什么它们具有不同的值? 让我们找出答案。
原因
Java 语言规范指出:
形式为E1 op= E2的复合赋值表达式与E1 = (T)((E1) op (E2)),等效,其中T为E1的类型,不同之处在于E1仅被求值一次。
因此,可以有效地将我们的原始示例代码覆盖如下:
int i = 5;double d1 = (double) i + 4.5;i = (int)(i + 4.5); //Result converted to intSystem.out.println(i);System.out.println(d1);Output:99.5
因此,值 9 只是从双精度到整数转换时精度丢失的结果。
学过的知识
始终非常小心地使用复合赋值运算符i + = j。 仅在处理类似数据类型时才应使用。 在不同的数据类型中,结果可能不正确。
祝您学习愉快!
参考
http://stackoverflow.com/questions/8710619/java-operator
http://docs.oracle.com/javase/specs/jls/se5.0/html/expressions .html#15.26.2
