原文: https://howtodoinjava.com/puzzles/compound-assignment-operator-i-j-is-not-same-as-i-i-j-in-java/

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

  1. int i = 5;
  2. double d1 = (double)i + 4.5; //necessary to satisfy compiler
  3. i += 4.5;
  4. System.out.println(i);
  5. System.out.println(d1);
  6. Output:
  7. 9
  8. 9.5

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

原因

Java 语言规范指出:

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

因此,可以有效地将我们的原始示例代码覆盖如下:

  1. int i = 5;
  2. double d1 = (double) i + 4.5;
  3. i = (int)(i + 4.5); //Result converted to int
  4. System.out.println(i);
  5. System.out.println(d1);
  6. Output:
  7. 9
  8. 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