为什么Java的+=,-=,*=,/=复合赋值操作符不需要转换?

为什么Java的+=,-=,*=,/=复合赋值操作符不需要转换?

直到今天,我还在想,例如:

i += j;

只是以下几个方面的捷径:

i = i + j;

但如果我们尝试这个:

int i = 5;long j = 8;

然后i = i + j;不会编译但是i += j;会编译得很好。

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


达令说
浏览 629回答 4
4回答

紫衣仙女

和往常一样,JLS掌握着答案。在这种情况下§15.26.2复合赋值算子。摘录:形式的复合赋值表达式E1 op= E2等于E1 = (T)((E1) op (E2)),在哪里T的类型E1,除了E1只计算一次。引用的一个例子第15.26.2节[.]以下代码是正确的:short x = 3;x += 4.6;并导致x的值为7,因为它相当于:short x = 3;x = (short)(x + 4.6);换句话说,你的假设是正确的。

慕哥9229398

这种转换的一个很好的例子是使用*=或/=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'

慕哥6287543

很好的问题。这个Java语言规范证实了你的建议。例如,以下代码是正确的:short x = 3;x += 4.6;并导致x的值为7,因为它相当于:short x = 3;x = (short)(x + 4.6);

繁华开满天机

是,基本上当我们写i += l;编译器将此转换为i = (int)(i + l);我刚查过.class文件代码。很高兴知道
打开App,查看更多内容
随时随地看视频慕课网APP