java中a + = 10和a = a + 10之间的区别?

这个问题在这里已经有了答案:

  • 为什么Java的+ =, - =,* =,/ =复合赋值操作符需要转换? 11个答案

  • 正如你现在提到的那样......在这种情况下有所不同:

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

    从Java语言规范第15.26.2节:

    E1 op= E2形式的复合赋值表达式等价于E1 = (T)((E1) op (E2)) ,其中TE1的类型,只是E1只计算一次。

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

    short x = 3;
    x += 4.6;
    

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


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

    编辑 :编译器不会为两者生成相同的代码,因为我刚发现。 看一下这个:

    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 ,这也是我们得到a = a + a


    这在Java语言规范第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.
    
    链接地址: http://www.djcxy.com/p/2019.html

    上一篇: Difference between a += 10 and a = a + 10 in java?

    下一篇: !!" in C code?