首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在java中,+= 10和a=a+ 10的区别是什么?

在java中,+= 10和a=a+ 10的区别是什么?
EN

Stack Overflow用户
提问于 2010-01-18 01:37:24
回答 5查看 6.1K关注 0票数 31

a += 10a = a + 10是相同的,还是它们之间有一些不同?我在学习Java作业时遇到了这个问题。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-01-18 01:44:29

就像你现在提到的选角...在这种情况下有一个区别:

代码语言:javascript
复制
byte a = 5;
a += 10; // Valid
a = a + 10; // Invalid, as the expression "a + 10" is of type int

来自Java Language Specification section 15.26.2

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

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

代码语言:javascript
复制
short x = 3;
x += 4.6;

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

票数 36
EN

Stack Overflow用户

发布于 2010-01-18 01:38:41

没有区别,一个是另一个的速记。甚至编译器也会为两者生成相同的指令。

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

代码语言:javascript
复制
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保存一些指令,只要右边有一个常量。

但是如果我们有了

a += a

然后代码看起来像这样:

代码语言:javascript
复制
   7:   iload_1
   8:   iload_1
   9:   iadd
   10:  istore_1

这和我们使用a = a + a得到的结果是一样的。

票数 17
EN

Stack Overflow用户

发布于 2010-01-18 01:51:44

这是在Java Language Specification, section 15.25.2中定义的。突出的部分是:

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

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

代码语言:javascript
复制
byte a = 100;
a += 1000;    // compiles
a = a + 1000; // doesn't compile, because an int cannot be assigned to a byte.
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2081932

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档