Difference between a += 10 and a = a + 10 in 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)) , whereT is the type ofE1 , except thatE1 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 |
如果我们有
这是在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; |
您可以了解在哪些情况下,+=运算符(以及其他赋值运算符)是有用的。如果表达式是非平凡的,+=运算符可以防止错误并提高可读性,从而提高可维护性。
在软件领域有一些术语,我可以向你解释,
在
但在第二种情况下,
希望这对您有帮助,还有一点,我们通常采用的方法是