8

是:

x -= y;

相当于:

x = x - y;
4

3 回答 3

37

不,它们不等同于您表达它们的方式。

short x = 0, y = 0;
x -= y;    // This compiles fine!
x = x - y; // This doesn't compile!!!
              // "Type mismatch: cannot convert from int to short"

第三行的问题是-执行操作数的所谓“数字提升”(JLS 5.6short,并产生一个int值,该值不能简单地分配给short没有强制转换的 a 。复合赋值运算符包含一个隐藏的演员表!

JLS 15.26.2 复合赋值运算符中列出了确切的等价关系:

E1 op= E2形式的复合赋值表达式等价于E1 = (T)((E1) op (E2)),其中TE1的类型,除了E1只计算一次。

因此,为了澄清一些微妙之处:

  • 复合赋值表达式不会重新排序操作数
    • 左侧停留在左侧,右侧停留在右侧
  • 两个操作数都用括号括起来,以确保op具有最低优先级
    • int x = 5; x *= 2 + 1; // x == 15, not 11
  • 有一个隐藏的演员表
    • int i = 0; i += 3.14159; // this compiles fine!
  • 左侧只评估一次
    • arr[i++] += 5; // this only increments i once

Java 也有*=, /=, %=, +=, -=, <<=, >>=, >>>=, &=,^=|=. 最后 3 个也是为布尔值定义的(JLS 15.22.2 布尔逻辑运算符)。

相关问题

于 2010-03-10T04:38:23.927 回答
5

是的。这种语法在大多数 C 派生语言中是相同的。

于 2010-03-10T04:33:02.183 回答
2

不完全是。在 C 中引入它的原因是允许程序员进行一些编译器无法进行的优化。例如:

A[i] += 4

以前编译得比

A[i] = A[i] + 4

由当时的编译器。

而且,如果“x”有副作用,例如“x++”,那么它就完全不同了。

于 2010-03-10T04:39:12.893 回答