java中a + = 10和a = a + 10之间的区别?
这个问题在这里已经有了答案:
正如你现在提到的那样......在这种情况下有所不同:
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))
,其中T
是E1
的类型,只是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?