a和x2B之间的差异10和a=a+;10个java版本?

a和x2B之间的差异10和a=a+;10个java版本?,java,variable-assignment,Java,Variable Assignment,a+=10和a=a+10两者是相同的,还是有一些区别?我在学习Java作业时遇到了这个问题。没有区别,一个是另一个的缩写。即使是编译器也会为这两种语言生成相同的指令 编辑:正如我刚刚发现的那样,编译器不会为两者生成相同的代码。看看这个: dan$ cat Test.java public class Test { public static void main(String[] args) { int a = 0; a = a + 10;

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

没有区别,一个是另一个的缩写。即使是编译器也会为这两种语言生成相同的指令

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

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

}

这与我们得到的结果相同,如果在您显示的表达式中有
a=a+a

,它们是等价的,在表达式中,如:

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

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

正如您现在提到的。。。在这种情况下有一个区别:

byte a = 5;
a += 10; // Valid
a = a + 10; // Invalid, as the expression "a + 10" is of type int
根据Java语言规范:

形式为
E1 op=E2
的复合赋值表达式等效于
E1=(T)((E1)op(E2))
,其中
T
E1
的类型,但
E1
仅计算一次

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

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

这是在中定义的。突出的部分是:

一个复合赋值表达式 形式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.

在S/W领域有一些术语,我可以给你解释一下

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

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

  • 系统知道
    a
    的值,并直接将10添加到a(此处未制作单独副本)

  • 希望这将对您有所帮助,还有一件事,我们通常使用的方法是
    a+=10
    因为它降低了运营成本,正如其他人所说,

    我知道这一点。但我读到了一些与铸造有关的不同之处。我不明白,所以我被要求在这里了解更多。你应该在topicstart中明确这点。@danben:很高兴看到编辑(因为编译器不会生成相同的代码)。但是,一旦一个支持JIT的JVM(比如HotSpot)得到它的控制,我的怀疑是,如果表达式没有其他影响,甚至更长的表单也会被优化为增量操作。嘿,你在哪里编译的
    Test.java
    ?:)@Pascal Thivent:为了简洁起见,我省略了这个。请原谅我的无知,但是当a被定义为字节时,为什么“a+10”是int类型?@劳尔:因为二进制数字提升。实际上,没有
    byte+(byte,byte)
    操作符。请参阅,字节a=100的值是多少;a+=1000aassign to a?1100二进制表示法的8个最低有效位,就像将int转换为字节一样。这个问题的重复问题是在这个问题之后发布的,所以它不应该是这个问题的重复吗?@Kröw不,这并不重要。例如,见。
    byte a = 100;
    a += 1000;    // compiles
    a = a + 1000; // doesn't compile, because an int cannot be assigned to a byte.