为什么字节 += 1 编译,但字节 = 字节 + 1 不?

2022-09-02 01:14:38

如果我有一个字节变量:byte b = 0;

为什么以下工作:

   b++;
   b += 1; // compiles

...但这不会?

   b = b + 1; // compile error

编译器是否首先理解为 ?byteint

[编辑]

我知道选角,但我想提请你注意b++, b += 1 and b = b + 1

我认为它们是相等的,那么为什么编译器会区别它们?两者之间有什么区别

  b += 1 and b = b + 1 ?

答案 1

因为 等价于 ,而 类型 被提升为 (JLS §5.6.2 二进制数值提升),因此如果没有显式转换,则无法将其结果赋值。b += 1b = (byte)(b + 1)b + 1intbyte

来自 JLS, §15.26.2 复合赋值运算符

形式为 E1 op= E2 的复合赋值表达式等价于 E1 = (T)((E1) op (E2)),其中 T 是 E1 的类型,只是 E1 只计算一次。


答案 2

可能损失精度是问题所在。投吧,没关系。

b = (byte) (b + 1);