直到今天,我还以为:
i += j;
只是一条捷径:
i = i + j;
但如果我们这样做:
int i = 5;
long j = 8;
则i=i+j;不会编译,但i+=j;将编译良好。
这是否意味着实际上i+=j;是这样的捷径吗i=(i的类型)(i+j)?
直到今天,我还以为:
i += j;
只是一条捷径:
i = i + j;
但如果我们这样做:
int i = 5;
long j = 8;
则i=i+j;不会编译,但i+=j;将编译良好。
这是否意味着实际上i+=j;是这样的捷径吗i=(i的类型)(i+j)?
当前回答
很好的问题。Java语言规范证实了您的建议。
例如,以下代码是正确的:短x=3;x+=4.6;并且导致x具有值7,因为它等于:短x=3;x=(短)(x+4.6);
其他回答
主要区别在于,当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);
对于这些问题,JLS一如既往地掌握着答案。在这种情况下,§15.26.2复合赋值运算符。摘录:
形式为E1 op=E2的复合赋值表达式等价于E1=(T)((E1)op(E2)),其中T是E1的类型,除了E1只计算一次。
§15.26.2中引用的示例
[…]以下代码正确:短x=3;x+=4.6;并且导致x具有值7,因为它等于:短x=3;x=(短)(x+4.6);
换句话说,你的假设是正确的。
很好的问题。Java语言规范证实了您的建议。
例如,以下代码是正确的:短x=3;x+=4.6;并且导致x具有值7,因为它等于:短x=3;x=(短)(x+4.6);
这里的问题涉及类型转换。
当您添加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'