短手赋值运算符,+=,真正的意思是什么?

5
我了解到 i+=2i=i+2 的简写。但是现在我对此表示怀疑。 对于下面的代码,上述知识并不适用:

byte b=0; b=b+2; //错误:需要 byte 类型,发现 int 类型

上面的代码是合理的,因为 2 是 int 类型,表达式返回 int 值。
但是,以下代码可以正常运行:

byte b=0; b+=2; //+= 操作后 b 存储 2

这让我开始怀疑,+= 简写操作符可能比我所知道的更复杂。 请解释一下。

请参阅:http://stackoverflow.com/questions/7038012/typecasting-with-shorthand-operators - Kevin Bowersox
2
如果已经有一个好的答案存在,那就没有必要再回答了。请查看这个链接:https://dev59.com/BGoy5IYBdhLWcg3wMLSj。该问题已经在那里被解决了。 - Fritz
2个回答

10
当有疑问时,您可以始终查阅Java语言规范。在此情况下,相关部分是15.26.2,复合赋值运算符。
形如E1 op = E2的复合赋值表达式相当于E1 = (T)((E1) op (E2)),其中T是E1的类型,除了E1只评估一次。
所以你几乎是正确的,只是还加入了一个强制转换。在您的案例中:
b + = 2; 符合要求 b =(byte)(b + 2);

根据这个,2仍然被视为int类型吗?填充占位符后,我的理解是b = (byte)b + 2;。 - Kevin Bowersox
所以 i+=2 可以转换为 i=(i的类型)(i+2)。谢谢 :) - CᴴᴀZ
1
@KevinBowersox 不,你必须将其读作 b = (byte)(b + 2); - Alexis C.
糟糕,我错过了那些额外的括号。 - Kevin Bowersox
@Antimony,你一定非常熟悉规范,才能在两分钟内找到这个。 - Kevin Bowersox

0

作为一个C++背景的人,我可以尝试声称这个概念是相似的。运算符+=被定义为左侧对象的方法,将右侧对象作为参数传递进去。这使得语言的编写者可以轻松地添加类型转换和兼容性修复等功能。唯一的问题是,据我所知,Java不允许用户重载操作符函数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接