提问



直到今天,我还以为:


i += j;


只是一个捷径:


i = i + j;


但是如果我们尝试这个怎么办:


int i = 5;
long j = 8;


然后i = i + j;将无法编译,但i += j;将编译正常。


这是否意味着实际上i += j;是这样的捷径
i = (type of i) (i + j)?

最佳参考


和往常一样,JLS都有答案。在本例中§15.26.2复合赋值运算符。提取物:[52]



  形式E1 op= E2的复合赋值表达式等同于E1 = (T)((E1) op (E2)),其中TE1的类型,除了E1仅被评估一次。



§15.26.2引用的一个例子[53]



  [[...]]以下代码是正确的:


short x = 3;
x += 4.6;

  
  并且结果x的值为7,因为它相当于:


short x = 3;
x = (short)(x + 4.6);



换句话说,你的假设是正确的。

其它参考1


这个演员的一个很好的例子是使用* =或/=


byte b = 10;
b *= 5.7;
System.out.println(b); // prints 57


要么


byte b = 100;
b /= 2.5;
System.out.println(b); // prints 40


要么


char ch = '0';
ch *= 1.1;
System.out.println(ch); // prints '4'


要么


char ch = 'A';
ch *= 1.5;
System.out.println(ch); // prints 'a'

其它参考2


非常好的问题。 Java语言规范证实了您的建议。[54]



  例如,以下代码是正确的:


short x = 3;
x += 4.6;

  
  并且结果x的值为7,因为它相当于:


short x = 3;
x = (short)(x + 4.6);


其它参考3


是,


基本上我们写的时候


i += l; 


编译器将其转换为


i = (int)(i + l);


我刚检查了.class文件代码。


真的是一件好事

其它参考4


i = i + l的情况下你需要从long转换为int explicitly然后它将编译并给出正确的输出。喜欢


i = i + (int)l;


要么


i = (int)((long)i + l); // this is what happens in case of += , dont need (long) casting since upper casting is done implicitly.


但是在+=的情况下,它只是工作正常,因为运算符隐式地从右变量的类型到左变量的类型进行类型转换,因此不需要显式转换。

其它参考5


这里的问题涉及类型铸造。


当你添加int和long时,



  1. int对象被转换为long&两者都被添加,你得到长对象。

  2. 但长对象不能隐式转换为int。所以,你必须明确地这样做。



但是+=的编码方式使它能够进行类型转换。 i=(int)(i+m)

其它参考6


在Java类型中,当赋值操作右侧的表达式类型可以安全地提升为赋值左侧的变量类型时,将自动执行转换。因此我们可以安全地分配:


 byte -> short -> int -> long -> float -> double. 


反之亦然。例如,我们不能自动将long转换为int,因为第一个需要比第二个更多的存储,因此信息可能会丢失。要强制执行此类转换,我们必须执行显式转换。

类型 - 转换[55]

其它参考7


有时,在面试时可以提出这样的问题。


例如,当你写:


int a = 2;
long b = 3;
a = a + b;


没有自动类型转换。在C ++中,编译上面的代码不会有任何错误,但在Java中你会得到像Incompatible type exception这样的东西。


所以要避免它,你必须编写如下代码:


int a = 2;
long b = 3;
a += b;// No compilation error or any exception due to the auto typecasting

其它参考8


主要区别在于a = a + b,没有进行类型转换,因此编译器因为没有进行类型转换而对你生气。但是a += b,它真正做的是将b类型转换为与a兼容的类型。所以如果你这样做的话


int a=5;
long b=10;
a+=b;
System.out.println(a);


你真正做的是:


int a=5;
long b=10;
a=a+(int)b;
System.out.println(a);

其它参考9


这里的细微之处......


j是double并且i是int时,i+j存在隐式类型转换。
Java 始终在它们之间存在操作时将整数转换为double。


澄清i+=j其中i是一个整数而j是双精度可以描述为


i = <int>(<double>i + j)


请参阅:隐式铸造[56]的这种描述


在这种情况下,为了清楚起见,您可能想要j(int)进行类型转换。