Java:+ =等价

时间:2010-03-10 04:31:14

标签: java variable-assignment compound-operator

时:

x -= y;

相当于:

x = x - y;

3 个答案:

答案 0 :(得分:38)

不,它们与你表达它们的方式不相同。

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"

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

确切的等同性在JLS 15.26.2 Compound Assignment Operators

中列出
  

E1 op = E2 形式的复合赋值表达式等效于 E1 =(T)((E1)op(E2)),其中 T E1 的类型,但 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还有*=/=%=+=-=<<=>>=,{{ 1}},>>>=&=^=。最后3个也定义为布尔值(JLS 15.22.2 Boolean Logical Operators)。

相关问题

答案 1 :(得分:5)

是的,确实如此。大多数C语言中的语法都是一样的。

答案 2 :(得分:2)

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

A[i] += 4

用于编译比

好得多
A[i] = A[i] + 4

当时的编制者。

而且,如果“x”有副作用,例如“x ++”那么它就会大不相同。