直到今天,我还以为:

i += j;

只是一条捷径:

i = i + j;

但如果我们这样做:

int i = 5;
long j = 8;

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

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


当前回答

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

i = i + (int)l;

or

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

但在+=的情况下,它工作得很好,因为运算符隐式执行从右变量类型到左变量类型的类型转换,因此不需要显式转换。

其他回答

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

例如,当您写:

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

没有自动打字。在C++中,编译上述代码时不会出现任何错误,但在Java中,您会遇到类似“不兼容类型异常”的情况。

因此,为了避免这种情况,您必须像这样编写代码:

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

Yes,

基本上当我们写作时

i += l; 

编译器将其转换为

i = (int)(i + l);

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

知道这真是件好事

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

当您添加int和long时,

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

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

主要区别在于,当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);

使用*=或/=

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'