原文: 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 compiler
i += 4.5;
System.out.println(i);
System.out.println(d1);
Output:
9
9.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 int
System.out.println(i);
System.out.println(d1);
Output:
9
9.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