直到今天,我还以为:

i += j;

只是一条捷径:

i = i + j;

但如果我们这样做:

int i = 5;
long j = 8;

则i=i+j;不会编译,但i+=j;将编译良好。

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


当前回答

使用*=或/=

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

or

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

or

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

or

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

其他回答

Yes,

基本上当我们写作时

i += l; 

编译器将其转换为

i = (int)(i + l);

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

知道这真是件好事

这里的问题涉及类型转换。

当您添加int和long时,

int对象被强制转换为long,这两个对象都被添加,您将得到long对象。但long对象不能隐式转换为int。因此,必须显式转换。

但+=的编码方式使其可以进行类型转换。i=(int)(i+m)

使用*=或/=

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

or

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

or

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

or

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

此处的微妙之处。。。

当j是double,i是int时,i+j有一个隐式类型转换。当整数之间有运算时,Java总是将整数转换为双精度。

为了澄清i+=j,其中i是整数,j是双精度,可以描述为

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

参见:隐式铸造的描述

为了清楚起见,在本例中可能需要将j类型转换为(int)。

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

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

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