【发布时间】:2011-01-25 18:01:56
【问题描述】:
是:
x -= y;
相当于:
x = x - y;
【问题讨论】:
标签: java variable-assignment compound-operator
是:
x -= y;
相当于:
x = x - y;
【问题讨论】:
标签: java variable-assignment compound-operator
不,它们与您表达它们的方式不同。
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 只计算一次。
所以要澄清一些微妙之处:
int x = 5; x *= 2 + 1; // x == 15, not 11int i = 0; i += 3.14159; // this compiles fine!arr[i++] += 5; // this only increments i onceJava 也有 *=、/=、%=、+=、-=、<<=、>>=、>>>=、&=、^= 和最后 3 个也是为布尔值定义的 (JLS 15.22.2 Boolean Logical Operators)。
【讨论】:
不完全是。在 C 中引入它的原因是允许程序员进行一些编译器无法进行的优化。例如:
A[i] += 4
以前编译得比
好很多A[i] = A[i] + 4
由当时的编译器。
而且,如果“x”有副作用,例如“x++”,那就大不相同了。
【讨论】:
是的,是的。这种语法在大多数 C 派生语言中都是相同的。
【讨论】: