java中a + = 10和a = a + 10之间的差异?

时间:2010-01-17 17:37:24

标签: java variable-assignment

a += 10a = a + 10是否相同,或者它们之间有什么区别?我在学习Java作业时遇到了这个问题。

5 个答案:

答案 0 :(得分:33)

正如你现在提到的那样......在这种情况下存在差异:

byte a = 5;
a += 10; // Valid
a = a + 10; // Invalid, as the expression "a + 10" is of type int

来自Java语言规范section 15.26.2

  

E1 op= E2形式的复合赋值表达式相当于   E1 = (T)((E1) op (E2)),其中TE1的类型,但E1仅评估一次。

有趣的是,他们在规范中给出的例子:

short x = 3;
x += 4.6;

在Java中有效,但在C#中 ...基本上在C#中,编译器执行+ =和 - =的特殊外壳以确保表达式是目标类型或者是目标类型范围内的文字。

答案 1 :(得分:17)

没有区别,一个是另一个的简写。甚至编译器也会为两者生成相同的指令。

编辑:正如我刚刚发现的那样,编译器不会为两者生成相同的代码。看看这个:

dan$ cat Test.java
public class Test {
    public static void main(String[] args) {
        int a = 0;
        a = a + 10;
        a += 20;
    }
}

dan$ javap -c Test
Compiled from "Test.java"
public class Test extends java.lang.Object{
public Test();
  Code:
   0:   aload_0
   1:   invokespecial   #1; //Method java/lang/Object."<init>":()V
   4:   return

public static void main(java.lang.String[]);
  Code:
   0:   iconst_0
   1:   istore_1
   2:   iload_1
   3:   bipush  10
   5:   iadd
   6:   istore_1
   7:   iinc    1, 20
   10:  return

}

所以简短的回答,特别是对于Java初学者,或者任何不担心在最小级别进行优化的人来说,它们是可以互换的。答案很长,取决于我阅读有关iadd vs iinc的内容。

编辑2 :好的,我回来了。指令规格(大致)如下:

iadd - 在堆栈中添加前两个整数

iinc - 通过常量

递增局部变量

正如我们上面所看到的,只要右侧有一个常量,我们就可以使用iinc保存一些指令。

但如果我们有

会发生什么

a += a

然后代码如下:

   7:   iload_1
   8:   iload_1
   9:   iadd
   10:  istore_1

如果我们有a = a + a,我们会得到同样的结果。

答案 2 :(得分:5)

这是在Java Language Specification, section 15.25.2中定义的。突出的部分是:

  

复合赋值表达式   E1 op = E2的形式相当于E1   =(T)((E1)op(E2)),其中T是E1的类型,除了E1是   只评估一次。

也就是说,在你的情况下,差异是隐式类型转换:

byte a = 100;
a += 1000;    // compiles
a = a + 1000; // doesn't compile, because an int cannot be assigned to a byte.

答案 3 :(得分:4)

在您显示的表达式中,它们是等效的,表达式如下:

array[getIndex(context)][some / complex + expression] += offset;

您可以了解+ =运算符(以及其他赋值运算符)在哪些情况下非常有用。如果表达式不重要,则+ =运算符可以防止错误并提高可读性,从而提高可维护性。

答案 4 :(得分:1)

在S / W领域有一些术语,我可以向您解释,

a=a+1 a中的

在两个步骤之后测量a

  1. 系统计算a的值(此处创建一个新的隔离副本)
  2. 系统将10添加到隔离变量a,然后将隔离a的值分配给左侧a
  3. 但在第二种情况下,

    1. 系统知道a += 10;的值并直接将10添加到a(此处未进行隔离复制)。
    2. 希望这对您有所帮助,还有一件事,我们通常使用{{1}}方法,因为它可以降低运营成本,就像其他人一样,