【问题标题】:Difference between a+=b and a=a+b in Java [duplicate]Java中a + = b和a = a + b之间的区别[重复]
【发布时间】:2014-12-05 11:35:17
【问题描述】:

有人告诉我 a+=b; 之间存在差异。 a=a+b;根据类型声明,这可能导致其中只有一个是合法的。

有人有这方面的例子吗?

【问题讨论】:

  • this 可能会帮助你
  • 谢谢!这就是我一直在寻找的,例如将 'a' 声明为字节,将 'b' 声明为 int 将导致 a=a+b 非法而 a+=b 合法。

标签: java types operators


【解决方案1】:

基本没有区别,但有细微差别。

算术赋值运算符执行隐式转换。例如

byte a = 1;
int b = 2;

a += b; // compiles
a = a + b; // doesn't compile as a byte + int = int
a = (byte) (a + b); // compiles as this is the same as +=

更多奇怪的例子。

int a = 5;
a += 1.5f;
// a == 6

char ch = '0'; // (char) 49
ch *= 1.1;     // ch = '4';

long l = Integer.MAX_VALUE;
l += 0.0f;   // i = (long ) ((long ) l + 0.0f)
// i == Integer.MAX_VALUE + 1L; WTF!?
// l is no longer Integer.MAX_VALUE due to rounding error.

【讨论】:

    【解决方案2】:

    JLS(15.26.2 部分)说:

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

    类型转换的存在意味着有几个极端情况,其中a = a op ba op= b 的含义不同。

    请参阅 Peter Lawrey 的回答以获取一个示例。当abyte 并且bint 并且“op”是+ 时。 “陷阱”是a + b 产生一个int,然后不能分配给a ...没有类型转换。

    对于ab 的其他类型以及其他算术和位运算符,同样的情况也适用。

    【讨论】:

      【解决方案3】:
      int a = 10;
      int b = 20;   
      a=a+b; // 30
      
      a+=b; // 30
      
      System.out.println(a);
      

      两者都会给出相同的答案。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-12-18
        • 2017-04-26
        • 2016-05-04
        • 1970-01-01
        • 1970-01-01
        • 2012-06-26
        • 1970-01-01
        相关资源
        最近更新 更多