关于变量赋值:java中a + = 10和a = a + 10之间的差异?

Difference between a += 10 and a = a + 10 in java?

本问题已经有最佳答案,请猛点这里访问。

a += 10a = a + 10是相同的,还是两者之间有区别?我在学习JAVA作业时遇到了这个问题。


正如你现在提到的演员阵容…在这种情况下有一个区别:

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

从Java语言规范部分1522.2:

A compound assignment expression of the form E1 op= E2 is equivalent to
E1 = (T)((E1) op (E2)), where T is the type of E1, except that E1 is evaluated only once.

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

1
2
short x = 3;
x += 4.6;

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


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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
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和IINC的了解。

编辑2:好的,我回来了。说明书大致如下:

IADD-在堆栈上添加前两个整数

IINC-用常量递增局部变量

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

但是如果我们有

EDOCX1?0?

然后代码如下:

1
2
3
4
   7:   iload_1
   8:   iload_1
   9:   iadd
   10:  istore_1

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


这是在Java语言规范,第1525.2节中定义的。最突出的部分是:

A compound assignment expression of
the form E1 op= E2 is equivalent to E1
= (T)((E1) op (E2)), where T is the type of E1, except that E1 is
evaluated only once.

也就是说,在您的情况下,不同之处在于隐式类型转换:

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


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

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

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


在软件领域有一些术语,我可以向你解释,

a=a+1中,a的赋值是在两个步骤之后测量的。

  • 系统计算的值(此处创建新的独立副本)
  • 系统对孤立变量a加10,则孤立a的值赋给左侧a
  • 但在第二种情况下,

  • 系统知道a的值,直接在a中加10(这里没有单独的拷贝)。
  • 希望这对您有帮助,还有一点,我们通常采用的方法是a += 10;因为它降低了操作成本,与其他方法一样,