无法使用表达式而使用增量运算符来增加字节值



原因以下是有效的

byte i=0;
i++;

其中,以下是无效的

byte i=0;
i=i+1;

原因是什么?

我知道在i+1的情况下,整个值显式地增加1(这将是int的值),因此会出现编译问题,但在i++的情况下也会这样做,但没有得到任何错误。

无论何时在不同类型的两个操作数之间执行二进制运算,其中一个操作数都会升级为更高的类型。然后运算的结果就是这种类型的。

因此,在您的案例中,byte类型a首先被提升为int,因为1int类型。然后在加法运算之后,结果是类型为int的。现在,由于无法将int分配给byte,因此需要进行类型转换以删除编译器错误:

byte a = 2;
a = a + 1;   // Error: Cannot assign an int value to byte
a = (byte)(a + 1);  // OK

现在,对于复合赋值运算符,类型转换是为您隐式完成的。表达式:

a += 1

内部转换为:

a = (byte)(a + 1);

这在JLS-§15.26.2复合分配运算符:中有规定

A compound assignment expression of the form E1 op= E2 is equivalent to E1 = (T) ((E1) op (E2)), where T is the type of E1, except that E1 is evaluated only once.

前缀增量运算符和后缀增量运算符的情况类似。

根据JLS-§15.15一元算子:

The type of the prefix increment expression is the type of the variable.

加法/减法/乘法等。这些操作是通过将RHS中的操作数转换为整数来完成的。。。因此,在这里,您试图将整数(操作完成后生成的RHS值)重新分配给一个字节。。。繁荣。"无法从INT转换为BYTE"-错误说明了一切。

这是因为在java中,当您说i = i + 1时,i的类型是byte,而1的类型是int。因此CCD_ 18+1的结果是CCD_。将其分配给byte会导致精度损失。

最新更新