【问题标题】:Java: += equivalenceJava:+=等价
【发布时间】:2011-01-25 18:01:56
【问题描述】:

是:

x -= y;

相当于:

x = x - y;

【问题讨论】:

标签: java variable-assignment compound-operator


【解决方案1】:

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

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)),其中 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 Boolean Logical Operators)。

相关问题

【讨论】:

  • 谁反对/反对?亲自尝试代码!等价是一个严格定义的概念,严格来说,这两个表达式是不等价的(否则代码会编译)。
  • 我们是来告诉人们他们想听什么,还是追求卓越而准确的技术知识?
  • 不知道为什么有人会否决这个。这是很好的信息。我仍然认为我的答案更直接地反映了问题的含义(正如马丁所说),但我不明白为什么有人会反对这个答案。
  • @Martin,@Chuck,我对细节做了一些澄清。
  • 必须运行它才能相信它。谢谢和+1
【解决方案2】:

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

A[i] += 4

以前编译得比

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

由当时的编译器。

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

【讨论】:

  • 在Java中,“x”怎么会有副作用?
  • 我相信他的意思是指一般的左侧,因此引用。请参阅我的第 4 个要点,关于在两次评估时很重要的重要左侧。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 2018-12-16
    • 2012-06-03
    • 2013-01-15
    • 1970-01-01
    • 1970-01-01
    • 2016-10-10
    • 2010-11-13
    • 2010-09-25
    • 2019-11-03
    相关资源
    最近更新 更多