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)

和往常一样,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);

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

  • 所以i+=j编译我检查自己,但会导致精度损失吗?如果是这样的话,为什么不让它发生在i = i + j呢?为什么让我们在那里?
  • 我猜测语言设计者觉得,在一种情况下(i += j),假设与另一种情况相反,期望精度的损失是安全的(i = i + j
  • 不,它就在我面前!对不起,我没有注意到它。就像在你的答案E1 op= E2 is equivalent to E1 = (T)((E1) op (E2))中那样,这就好像是隐含的类型转换(从long到int)。而在i = i + j中,我们必须明确地做,即提供(T)部分E1 = ((E1) op (E2))是不是?
  • 我假设这是用来避免f在添加一个双重文字到短的情况下明确的演员和/或后缀?
  • Java编译器为什么要添加一个类型转换的一个可能的原因是因为如果你试图对不兼容的类型进行算术运算,那么就没有办法用契约形式来执行结果的类型转换。结果的类型转换通常比有问题的参数的类型转换更准确。当使用不兼容的类型时,没有类型转换会使收缩无用,因为它总是会导致编译器抛出一个错误。

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

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'

很好的问题。在Java语言规范确认您的建议。

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

short x = 3;
x += 4.6;

并导致x的值为7,因为它相当于:

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

是,

基本上当我们写

i += l; 

编译器将其转换为

i = (int)(i + l);

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

真的是一件很好的事情要知道

添加评论

友情链接:蝴蝶教程